--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
scripts/license_scope_mapper.go v4.7.0-rc.4 (448cd46c) Text, 33.52 KB
T8b949e// SPDX-License-Identifier: 0BSD
T8b949e//
T8b949e// license_scope_mapper analyzes file similarity against an upstream repository
T8b949e// and emits per-file SPDX license recommendations with optional header updates.
T8b949e//
T8b949e// Quick start:
T8b949e//
T8b949e// go run scripts/license_scope_mapper.go \
T8b949e// --repo-root "/run/media/user1/projects/reticulum-meshchatX" \
T8b949e// --overrides "scripts/license_scope_overrides.json" \
T8b949e// --write-headers --replace-existing
T8b949e//
T8b949e// Environment variables are supported with the LICENSE_SCOPE_ prefix
T8b949e// (for example LICENSE_SCOPE_SCAN_EXTS and LICENSE_SCOPE_HEADER_EXTS).
T8b949e//
T8b949e// Important caveats (read before relying on output):
T8b949e//
T8b949e// 1. Textual similarity is not a legal test for derivative-work status. A file
T8b949e// forked from upstream and heavily refactored or renamed is still a
T8b949e// derivative work and still carries upstream license obligations. The
T8b949e// pure-0BSD branch is therefore opt-in (--allow-pure-0bsd) and gated
T8b949e// behind --pure-0bsd-confirm-no-derivation to avoid accidental
T8b949e// relicensing of upstream-derived material.
T8b949e//
T8b949e// 2. --clean-non-target-spdx and --replace-existing rewrite or delete
T8b949e// SPDX markers in tracked files. Run with --report-json first and
T8b949e// review the diff before enabling either flag; third-party SPDX lines
T8b949e// in vendored or generated files must not be silently stripped.
T8b949e//
T8b949e// 3. The default base license is "0BSD AND MIT", which means BOTH licenses
T8b949e// apply simultaneously to their respective contributions. This is the
T8b949e// safe default for files where provenance cannot be cleanly separated.
Tff7b72package Te6edf3main
Tff7b72import Tb4b4b4(
Ta5d6ff"bufio"
Ta5d6ff"bytes"
Ta5d6ff"context"
Ta5d6ff"crypto/sha256"
Ta5d6ff"encoding/hex"
Ta5d6ff"encoding/json"
Ta5d6ff"errors"
Ta5d6ff"flag"
Ta5d6ff"fmt"
Ta5d6ff"hash/fnv"
Ta5d6ff"io/fs"
Ta5d6ff"os"
Ta5d6ff"os/exec"
Ta5d6ff"path/filepath"
Ta5d6ff"regexp"
Ta5d6ff"runtime"
Ta5d6ff"sort"
Ta5d6ff"strconv"
Ta5d6ff"strings"
Ta5d6ff"time"
Tb4b4b4)
Tff7b72const Tb4b4b4(
Te6edf3envPrefix Tb4b4b4= Ta5d6ff"LICENSE_SCOPE_"
Te6edf3defaultUpstreamURL Tb4b4b4= Ta5d6ff"https://github.com/liamcottle/reticulum-meshchat"
Tb4b4b4)
Tff7b72var Te6edf3spdxPattern Tb4b4b4= Te6edf3regexpTb4b4b4.Te6edf3MustCompileTb4b4b4(Ta5d6ff`SPDX-License-Identifier:\s*([A-Za-z0-9.\-+ ()]+)`Tb4b4b4)
Tff7b72type Te6edf3config Tff7b72struct Tb4b4b4{
Te6edf3repoRoot Tffa657string
Te6edf3upstreamPath Tffa657string
Te6edf3upstreamURL Tffa657string
Te6edf3upstreamBranch Tffa657string
Te6edf3cloneTimeout Te6edf3timeTb4b4b4.Te6edf3Duration
Te6edf3scanExtsRaw Tffa657string
Te6edf3headerExtsRaw Tffa657string
Te6edf3excludeDirsRaw Tffa657string
Te6edf3excludePathsRaw Tffa657string
Te6edf3maxFileSizeBytes Tffa657int64
Te6edf3mitThreshold Tffa657float64
Te6edf3mixedThreshold Tffa657float64
Te6edf3allowPure0BSD Tffa657bool
Te6edf3pure0BSDConfirmNoDerivation Tffa657bool
Te6edf3pure0BSDThreshold Tffa657float64
Te6edf3baseLicense Tffa657string
Te6edf3maxNameCandidates Tffa657int
Te6edf3writeHeaders Tffa657bool
Te6edf3replaceExisting Tffa657bool
Te6edf3cleanNonTarget Tffa657bool
Te6edf3overridesPath Tffa657string
Te6edf3reportJSON Tffa657string
Te6edf3explainPathsRaw Tffa657string
Te6edf3explainAll Tffa657bool
Te6edf3scanExts Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}
Te6edf3headerExts Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}
Te6edf3excludedDirs Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}
Te6edf3excludedContains Tb4b4b4[Tb4b4b4]Tffa657string
Te6edf3explainPaths Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}
Tb4b4b4}
Tff7b72type Te6edf3fileData Tff7b72struct Tb4b4b4{
Te6edf3absPath Tffa657string
Te6edf3relPath Tffa657string
Te6edf3baseName Tffa657string
Te6edf3normHash Tffa657string
Te6edf3lineSet Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}
Te6edf3bigramSet Tff7b72mapTb4b4b4[Tffa657uint64Tb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}
Te6edf3shingle5Set Tff7b72mapTb4b4b4[Tffa657uint64Tb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}
Te6edf3shingle7Set Tff7b72mapTb4b4b4[Tffa657uint64Tb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}
Tb4b4b4}
Tff7b72type Te6edf3matchResult Tff7b72struct Tb4b4b4{
Te6edf3upstreamRelPath Tffa657string
Te6edf3directPathMatch Tffa657bool
Te6edf3similarityPct Tffa657float64
Te6edf3lineJaccardPct Tffa657float64
Te6edf3bigramDicePct Tffa657float64
Te6edf3shingle5Pct Tffa657float64
Te6edf3shingle7Pct Tffa657float64
Te6edf3lineCommon Tffa657int
Te6edf3lineUnion Tffa657int
Te6edf3bigramCommon Tffa657int
Te6edf3bigramTotal Tffa657int
Te6edf3shingle5Common Tffa657int
Te6edf3shingle5Union Tffa657int
Te6edf3shingle7Common Tffa657int
Te6edf3shingle7Union Tffa657int
Tb4b4b4}
Tff7b72type Te6edf3reportItem Tff7b72struct Tb4b4b4{
Te6edf3Path Tffa657string Ta5d6ff`json:"path"`
Te6edf3License Tffa657string Ta5d6ff`json:"license"`
Te6edf3SimilarityPct Tffa657float64 Ta5d6ff`json:"similarity_pct"`
Te6edf3LineJaccardPct Tffa657float64 Ta5d6ff`json:"line_jaccard_pct"`
Te6edf3BigramDicePct Tffa657float64 Ta5d6ff`json:"bigram_dice_pct"`
Te6edf3Shingle5Pct Tffa657float64 Ta5d6ff`json:"shingle5_jaccard_pct"`
Te6edf3Shingle7Pct Tffa657float64 Ta5d6ff`json:"shingle7_jaccard_pct"`
Te6edf3OriginalPct Tffa657float64 Ta5d6ff`json:"original_pct"`
Te6edf3MinePct Tffa657float64 Ta5d6ff`json:"mine_pct"`
Te6edf3UpstreamMatch Tffa657string Ta5d6ff`json:"upstream_match"`
Te6edf3DirectPathMatch Tffa657bool Ta5d6ff`json:"direct_path_match"`
Te6edf3HeaderChanged Tffa657bool Ta5d6ff`json:"header_changed"`
Te6edf3ExistingSPDX Tffa657string Ta5d6ff`json:"existing_spdx,omitempty"`
Tb4b4b4}
Tff7b72type Te6edf3reportConfig Tff7b72struct Tb4b4b4{
Te6edf3RepoRoot Tffa657string Ta5d6ff`json:"repo_root"`
Te6edf3UpstreamURL Tffa657string Ta5d6ff`json:"upstream_url"`
Te6edf3UpstreamBranch Tffa657string Ta5d6ff`json:"upstream_branch"`
Te6edf3ScanExtensions Tffa657string Ta5d6ff`json:"scan_extensions"`
Te6edf3HeaderExtensions Tffa657string Ta5d6ff`json:"header_extensions"`
Te6edf3MitThreshold Tffa657float64 Ta5d6ff`json:"mit_threshold"`
Te6edf3MixedThreshold Tffa657float64 Ta5d6ff`json:"mixed_threshold"`
Te6edf3AllowPure0BSD Tffa657bool Ta5d6ff`json:"allow_pure_0bsd"`
Te6edf3Pure0BSDConfirmNoDerivation Tffa657bool Ta5d6ff`json:"pure_0bsd_confirm_no_derivation"`
Te6edf3Pure0BSDThreshold Tffa657float64 Ta5d6ff`json:"pure_0bsd_threshold_pct"`
Te6edf3BaseLicense Tffa657string Ta5d6ff`json:"base_license"`
Te6edf3MaxNameCandidates Tffa657int Ta5d6ff`json:"max_name_candidates"`
Te6edf3WriteHeaders Tffa657bool Ta5d6ff`json:"write_headers"`
Te6edf3ReplaceExisting Tffa657bool Ta5d6ff`json:"replace_existing"`
Te6edf3CleanNonTarget Tffa657bool Ta5d6ff`json:"clean_non_target_spdx"`
Te6edf3OverridesPath Tffa657string Ta5d6ff`json:"overrides_path,omitempty"`
Tb4b4b4}
Tff7b72type Te6edf3reportSummary Tff7b72struct Tb4b4b4{
Te6edf3FilesAnalyzed Tffa657int Ta5d6ff`json:"files_analyzed"`
Te6edf3HeadersUpdated Tffa657int Ta5d6ff`json:"headers_updated"`
Te6edf3RemovedNonTargetSPDX Tffa657int Ta5d6ff`json:"removed_non_target_spdx"`
Te6edf3LicenseCounts Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657int Ta5d6ff`json:"license_counts"`
Tb4b4b4}
Tff7b72type Te6edf3reportDocument Tff7b72struct Tb4b4b4{
Te6edf3GeneratedAt Tffa657string Ta5d6ff`json:"generated_at"`
Te6edf3Config Te6edf3reportConfig Ta5d6ff`json:"config"`
Te6edf3Summary Te6edf3reportSummary Ta5d6ff`json:"summary"`
Te6edf3Results Tb4b4b4[Tb4b4b4]Te6edf3reportItem Ta5d6ff`json:"results"`
Tb4b4b4}
Tff7b72var Te6edf3commentStyleByExt Tb4b4b4= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657stringTb4b4b4{
Ta5d6ff".py"Tb4b4b4: Ta5d6ff"hash"Tb4b4b4,
Ta5d6ff".sh"Tb4b4b4: Ta5d6ff"hash"Tb4b4b4,
Ta5d6ff".bash"Tb4b4b4: Ta5d6ff"hash"Tb4b4b4,
Ta5d6ff".zsh"Tb4b4b4: Ta5d6ff"hash"Tb4b4b4,
Ta5d6ff".yml"Tb4b4b4: Ta5d6ff"hash"Tb4b4b4,
Ta5d6ff".yaml"Tb4b4b4: Ta5d6ff"hash"Tb4b4b4,
Ta5d6ff".toml"Tb4b4b4: Ta5d6ff"hash"Tb4b4b4,
Ta5d6ff".ini"Tb4b4b4: Ta5d6ff"hash"Tb4b4b4,
Ta5d6ff".cfg"Tb4b4b4: Ta5d6ff"hash"Tb4b4b4,
Ta5d6ff".conf"Tb4b4b4: Ta5d6ff"hash"Tb4b4b4,
Ta5d6ff".mk"Tb4b4b4: Ta5d6ff"hash"Tb4b4b4,
Ta5d6ff".js"Tb4b4b4: Ta5d6ff"line"Tb4b4b4,
Ta5d6ff".ts"Tb4b4b4: Ta5d6ff"line"Tb4b4b4,
Ta5d6ff".jsx"Tb4b4b4: Ta5d6ff"line"Tb4b4b4,
Ta5d6ff".tsx"Tb4b4b4: Ta5d6ff"line"Tb4b4b4,
Ta5d6ff".c"Tb4b4b4: Ta5d6ff"line"Tb4b4b4,
Ta5d6ff".h"Tb4b4b4: Ta5d6ff"line"Tb4b4b4,
Ta5d6ff".cpp"Tb4b4b4: Ta5d6ff"line"Tb4b4b4,
Ta5d6ff".hpp"Tb4b4b4: Ta5d6ff"line"Tb4b4b4,
Ta5d6ff".java"Tb4b4b4: Ta5d6ff"line"Tb4b4b4,
Ta5d6ff".go"Tb4b4b4: Ta5d6ff"line"Tb4b4b4,
Ta5d6ff".rs"Tb4b4b4: Ta5d6ff"line"Tb4b4b4,
Ta5d6ff".swift"Tb4b4b4: Ta5d6ff"line"Tb4b4b4,
Ta5d6ff".kt"Tb4b4b4: Ta5d6ff"line"Tb4b4b4,
Ta5d6ff".css"Tb4b4b4: Ta5d6ff"block"Tb4b4b4,
Ta5d6ff".scss"Tb4b4b4: Ta5d6ff"block"Tb4b4b4,
Ta5d6ff".less"Tb4b4b4: Ta5d6ff"block"Tb4b4b4,
Ta5d6ff".html"Tb4b4b4: Ta5d6ff"html"Tb4b4b4,
Ta5d6ff".xml"Tb4b4b4: Ta5d6ff"html"Tb4b4b4,
Ta5d6ff".vue"Tb4b4b4: Ta5d6ff"html"Tb4b4b4,
Ta5d6ff".md"Tb4b4b4: Ta5d6ff"html"Tb4b4b4,
Tb4b4b4}
Tff7b72func Te6edf3mainTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3cfgTb4b4b4, Te6edf3err Tff7b72:= Te6edf3parseConfigTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Te6edf3exitErrTb4b4b4(Te6edf3errTb4b4b4)
Tb4b4b4}
Te6edf3emitSafetyNoticesTb4b4b4(Te6edf3cfgTb4b4b4)
Tff7b72if Te6edf3cfgTb4b4b4.Te6edf3cleanNonTarget Tb4b4b4{
Te6edf3removedTb4b4b4, Te6edf3err Tff7b72:= Te6edf3removeSPDXFromNonTargetFilesTb4b4b4(Te6edf3cfgTb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Te6edf3exitErrTb4b4b4(Te6edf3errTb4b4b4)
Tb4b4b4}
Te6edf3fmtTb4b4b4.Te6edf3PrintfTb4b4b4(Ta5d6ff"Removed SPDX headers from non-target files: %d\n"Tb4b4b4, Te6edf3removedTb4b4b4)
Tb4b4b4}
Te6edf3upstreamRoot Tff7b72:= Te6edf3cfgTb4b4b4.Te6edf3upstreamPath
Te6edf3cleanup Tff7b72:= Tff7b72funcTb4b4b4(Tb4b4b4) Tb4b4b4{Tb4b4b4}
Tff7b72if Te6edf3stringsTb4b4b4.Te6edf3TrimSpaceTb4b4b4(Te6edf3upstreamRootTb4b4b4) Tff7b72== Ta5d6ff"" Tb4b4b4{
Te6edf3tmpDirTb4b4b4, Te6edf3err Tff7b72:= Te6edf3osTb4b4b4.Te6edf3MkdirTempTb4b4b4(Ta5d6ff""Tb4b4b4, Ta5d6ff"license-scope-upstream-*"Tb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Te6edf3exitErrTb4b4b4(Te6edf3errTb4b4b4)
Tb4b4b4}
Te6edf3cleanup Tb4b4b4= Tff7b72funcTb4b4b4(Tb4b4b4) Tb4b4b4{ Te6edf3_ Tb4b4b4= Te6edf3osTb4b4b4.Te6edf3RemoveAllTb4b4b4(Te6edf3tmpDirTb4b4b4) Tb4b4b4}
Te6edf3upstreamRoot Tb4b4b4= Te6edf3filepathTb4b4b4.Te6edf3JoinTb4b4b4(Te6edf3tmpDirTb4b4b4, Ta5d6ff"upstream"Tb4b4b4)
Tff7b72if Te6edf3err Tff7b72:= Te6edf3cloneUpstreamTb4b4b4(Te6edf3cfgTb4b4b4, Te6edf3upstreamRootTb4b4b4)Tb4b4b4; Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Te6edf3cleanupTb4b4b4(Tb4b4b4)
Te6edf3exitErrTb4b4b4(Te6edf3errTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72defer Te6edf3cleanupTb4b4b4(Tb4b4b4)
Te6edf3repoRootAbsTb4b4b4, Te6edf3_ Tff7b72:= Te6edf3filepathTb4b4b4.Te6edf3AbsTb4b4b4(Te6edf3cfgTb4b4b4.Te6edf3repoRootTb4b4b4)
Te6edf3upstreamAbsTb4b4b4, Te6edf3_ Tff7b72:= Te6edf3filepathTb4b4b4.Te6edf3AbsTb4b4b4(Te6edf3upstreamRootTb4b4b4)
Te6edf3localFilesTb4b4b4, Te6edf3err Tff7b72:= Te6edf3discoverFilesTb4b4b4(Te6edf3cfgTb4b4b4, Te6edf3repoRootAbsTb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Te6edf3exitErrTb4b4b4(Te6edf3errTb4b4b4)
Tb4b4b4}
Te6edf3overridesTb4b4b4, Te6edf3err Tff7b72:= Te6edf3loadOverridesTb4b4b4(Te6edf3cfgTb4b4b4.Te6edf3overridesPathTb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Te6edf3exitErrTb4b4b4(Te6edf3errTb4b4b4)
Tb4b4b4}
Te6edf3upstreamFilesTb4b4b4, Te6edf3err Tff7b72:= Te6edf3discoverFilesTb4b4b4(Te6edf3cfgTb4b4b4, Te6edf3upstreamAbsTb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Te6edf3exitErrTb4b4b4(Te6edf3errTb4b4b4)
Tb4b4b4}
Te6edf3upstreamByRel Tff7b72:= Tffa657makeTb4b4b4(Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Te6edf3fileDataTb4b4b4, Tffa657lenTb4b4b4(Te6edf3upstreamFilesTb4b4b4)Tb4b4b4)
Te6edf3upstreamByBase Tff7b72:= Tffa657makeTb4b4b4(Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tb4b4b4[Tb4b4b4]Te6edf3fileDataTb4b4b4, Tffa657lenTb4b4b4(Te6edf3upstreamFilesTb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3_Tb4b4b4, Te6edf3f Tff7b72:= Tff7b72range Te6edf3upstreamFiles Tb4b4b4{
Te6edf3upstreamByRelTb4b4b4[Te6edf3fTb4b4b4.Te6edf3relPathTb4b4b4] Tb4b4b4= Te6edf3f
Te6edf3upstreamByBaseTb4b4b4[Te6edf3fTb4b4b4.Te6edf3baseNameTb4b4b4] Tb4b4b4= Tffa657appendTb4b4b4(Te6edf3upstreamByBaseTb4b4b4[Te6edf3fTb4b4b4.Te6edf3baseNameTb4b4b4]Tb4b4b4, Te6edf3fTb4b4b4)
Tb4b4b4}
Te6edf3results Tff7b72:= Tffa657makeTb4b4b4(Tb4b4b4[Tb4b4b4]Te6edf3reportItemTb4b4b4, T79c0ff0Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3localFilesTb4b4b4)Tb4b4b4)
Te6edf3classCounts Tff7b72:= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657intTb4b4b4{Tb4b4b4}
Te6edf3headersUpdated Tff7b72:= T79c0ff0
Te6edf3removedNonTarget Tff7b72:= T79c0ff0
Tff7b72if Te6edf3cfgTb4b4b4.Te6edf3cleanNonTarget Tb4b4b4{
T8b949e// We report cleanup count from function call side-effect by rescanning isn't needed.
T8b949e// Keep zero here and rely on printed output.
Tb4b4b4}
Tff7b72for Te6edf3_Tb4b4b4, Te6edf3local Tff7b72:= Tff7b72range Te6edf3localFiles Tb4b4b4{
Te6edf3match Tff7b72:= Te6edf3findBestMatchTb4b4b4(Te6edf3localTb4b4b4, Te6edf3upstreamByRelTb4b4b4, Te6edf3upstreamByBaseTb4b4b4, Te6edf3cfgTb4b4b4.Te6edf3maxNameCandidatesTb4b4b4)
Te6edf3licenseTb4b4b4, Te6edf3decisionReason Tff7b72:= Te6edf3classifyTb4b4b4(Te6edf3matchTb4b4b4, Te6edf3cfgTb4b4b4)
Tff7b72if Te6edf3forcedTb4b4b4, Te6edf3ok Tff7b72:= Te6edf3overridesTb4b4b4[Te6edf3localTb4b4b4.Te6edf3relPathTb4b4b4]Tb4b4b4; Te6edf3ok Tb4b4b4{
Te6edf3license Tb4b4b4= Te6edf3forced
Te6edf3decisionReason Tb4b4b4= Ta5d6ff"override file matched path"
Tb4b4b4}
Te6edf3classCountsTb4b4b4[Te6edf3licenseTb4b4b4]Tff7b72++
Te6edf3item Tff7b72:= Te6edf3reportItemTb4b4b4{
Te6edf3PathTb4b4b4: Te6edf3localTb4b4b4.Te6edf3relPathTb4b4b4,
Te6edf3LicenseTb4b4b4: Te6edf3licenseTb4b4b4,
Te6edf3SimilarityPctTb4b4b4: Te6edf3round2Tb4b4b4(Te6edf3matchTb4b4b4.Te6edf3similarityPctTb4b4b4)Tb4b4b4,
Te6edf3LineJaccardPctTb4b4b4: Te6edf3round2Tb4b4b4(Te6edf3matchTb4b4b4.Te6edf3lineJaccardPctTb4b4b4)Tb4b4b4,
Te6edf3BigramDicePctTb4b4b4: Te6edf3round2Tb4b4b4(Te6edf3matchTb4b4b4.Te6edf3bigramDicePctTb4b4b4)Tb4b4b4,
Te6edf3Shingle5PctTb4b4b4: Te6edf3round2Tb4b4b4(Te6edf3matchTb4b4b4.Te6edf3shingle5PctTb4b4b4)Tb4b4b4,
Te6edf3Shingle7PctTb4b4b4: Te6edf3round2Tb4b4b4(Te6edf3matchTb4b4b4.Te6edf3shingle7PctTb4b4b4)Tb4b4b4,
Te6edf3OriginalPctTb4b4b4: Te6edf3round2Tb4b4b4(Te6edf3matchTb4b4b4.Te6edf3similarityPctTb4b4b4)Tb4b4b4,
Te6edf3MinePctTb4b4b4: Te6edf3round2Tb4b4b4(T79c0ff100.0 Tff7b72- Te6edf3matchTb4b4b4.Te6edf3similarityPctTb4b4b4)Tb4b4b4,
Te6edf3UpstreamMatchTb4b4b4: Te6edf3matchTb4b4b4.Te6edf3upstreamRelPathTb4b4b4,
Te6edf3DirectPathMatchTb4b4b4: Te6edf3matchTb4b4b4.Te6edf3directPathMatchTb4b4b4,
Tb4b4b4}
Tff7b72if Te6edf3cfgTb4b4b4.Te6edf3writeHeaders Tff7b72&& Te6edf3isHeaderExtTb4b4b4(Te6edf3localTb4b4b4.Te6edf3relPathTb4b4b4, Te6edf3cfgTb4b4b4.Te6edf3headerExtsTb4b4b4) Tb4b4b4{
Te6edf3changedTb4b4b4, Te6edf3existingTb4b4b4, Te6edf3err Tff7b72:= Te6edf3upsertSPDXTb4b4b4(Te6edf3localTb4b4b4.Te6edf3absPathTb4b4b4, Te6edf3licenseTb4b4b4, Te6edf3cfgTb4b4b4.Te6edf3replaceExistingTb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Te6edf3fmtTb4b4b4.Te6edf3FprintfTb4b4b4(Te6edf3osTb4b4b4.Te6edf3StderrTb4b4b4, Ta5d6ff"SPDX update failed for %s: %v\n"Tb4b4b4, Te6edf3localTb4b4b4.Te6edf3relPathTb4b4b4, Te6edf3errTb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3itemTb4b4b4.Te6edf3HeaderChanged Tb4b4b4= Te6edf3changed
Te6edf3itemTb4b4b4.Te6edf3ExistingSPDX Tb4b4b4= Te6edf3existing
Tff7b72if Te6edf3changed Tb4b4b4{
Te6edf3headersUpdatedTff7b72++
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tff7b72if Te6edf3shouldExplainPathTb4b4b4(Te6edf3localTb4b4b4.Te6edf3relPathTb4b4b4, Te6edf3cfgTb4b4b4.Te6edf3explainAllTb4b4b4, Te6edf3cfgTb4b4b4.Te6edf3explainPathsTb4b4b4) Tb4b4b4{
Te6edf3printExplanationTb4b4b4(Te6edf3localTb4b4b4.Te6edf3relPathTb4b4b4, Te6edf3matchTb4b4b4, Te6edf3licenseTb4b4b4, Te6edf3decisionReasonTb4b4b4, Te6edf3cfgTb4b4b4)
Tb4b4b4}
Te6edf3results Tb4b4b4= Tffa657appendTb4b4b4(Te6edf3resultsTb4b4b4, Te6edf3itemTb4b4b4)
Tb4b4b4}
Te6edf3sortTb4b4b4.Te6edf3SliceTb4b4b4(Te6edf3resultsTb4b4b4, Tff7b72funcTb4b4b4(Te6edf3iTb4b4b4, Te6edf3j Tffa657intTb4b4b4) Tffa657bool Tb4b4b4{ Tff7b72return Te6edf3resultsTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4.Te6edf3Path Tb4b4b4< Te6edf3resultsTb4b4b4[Te6edf3jTb4b4b4]Tb4b4b4.Te6edf3Path Tb4b4b4}Tb4b4b4)
Te6edf3doc Tff7b72:= Te6edf3reportDocumentTb4b4b4{
Te6edf3GeneratedAtTb4b4b4: Te6edf3timeTb4b4b4.Te6edf3NowTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3UTCTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3FormatTb4b4b4(Te6edf3timeTb4b4b4.Te6edf3RFC3339Tb4b4b4)Tb4b4b4,
Te6edf3ConfigTb4b4b4: Te6edf3reportConfigTb4b4b4{
Te6edf3RepoRootTb4b4b4: Te6edf3repoRootAbsTb4b4b4,
Te6edf3UpstreamURLTb4b4b4: Te6edf3cfgTb4b4b4.Te6edf3upstreamURLTb4b4b4,
Te6edf3UpstreamBranchTb4b4b4: Te6edf3cfgTb4b4b4.Te6edf3upstreamBranchTb4b4b4,
Te6edf3ScanExtensionsTb4b4b4: Te6edf3cfgTb4b4b4.Te6edf3scanExtsRawTb4b4b4,
Te6edf3HeaderExtensionsTb4b4b4: Te6edf3cfgTb4b4b4.Te6edf3headerExtsRawTb4b4b4,
Te6edf3MitThresholdTb4b4b4: Te6edf3cfgTb4b4b4.Te6edf3mitThresholdTb4b4b4,
Te6edf3MixedThresholdTb4b4b4: Te6edf3cfgTb4b4b4.Te6edf3mixedThresholdTb4b4b4,
Te6edf3AllowPure0BSDTb4b4b4: Te6edf3cfgTb4b4b4.Te6edf3allowPure0BSDTb4b4b4,
Te6edf3Pure0BSDConfirmNoDerivationTb4b4b4: Te6edf3cfgTb4b4b4.Te6edf3pure0BSDConfirmNoDerivationTb4b4b4,
Te6edf3Pure0BSDThresholdTb4b4b4: Te6edf3cfgTb4b4b4.Te6edf3pure0BSDThresholdTb4b4b4,
Te6edf3BaseLicenseTb4b4b4: Te6edf3cfgTb4b4b4.Te6edf3baseLicenseTb4b4b4,
Te6edf3MaxNameCandidatesTb4b4b4: Te6edf3cfgTb4b4b4.Te6edf3maxNameCandidatesTb4b4b4,
Te6edf3WriteHeadersTb4b4b4: Te6edf3cfgTb4b4b4.Te6edf3writeHeadersTb4b4b4,
Te6edf3ReplaceExistingTb4b4b4: Te6edf3cfgTb4b4b4.Te6edf3replaceExistingTb4b4b4,
Te6edf3CleanNonTargetTb4b4b4: Te6edf3cfgTb4b4b4.Te6edf3cleanNonTargetTb4b4b4,
Te6edf3OverridesPathTb4b4b4: Te6edf3cfgTb4b4b4.Te6edf3overridesPathTb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3SummaryTb4b4b4: Te6edf3reportSummaryTb4b4b4{
Te6edf3FilesAnalyzedTb4b4b4: Tffa657lenTb4b4b4(Te6edf3resultsTb4b4b4)Tb4b4b4,
Te6edf3HeadersUpdatedTb4b4b4: Te6edf3headersUpdatedTb4b4b4,
Te6edf3RemovedNonTargetSPDXTb4b4b4: Te6edf3removedNonTargetTb4b4b4,
Te6edf3LicenseCountsTb4b4b4: Te6edf3classCountsTb4b4b4,
Tb4b4b4}Tb4b4b4,
Te6edf3ResultsTb4b4b4: Te6edf3resultsTb4b4b4,
Tb4b4b4}
Te6edf3reportPath Tff7b72:= Te6edf3filepathTb4b4b4.Te6edf3JoinTb4b4b4(Te6edf3repoRootAbsTb4b4b4, Te6edf3cfgTb4b4b4.Te6edf3reportJSONTb4b4b4)
Te6edf3reportBytesTb4b4b4, Te6edf3err Tff7b72:= Te6edf3jsonTb4b4b4.Te6edf3MarshalIndentTb4b4b4(Te6edf3docTb4b4b4, Ta5d6ff""Tb4b4b4, Ta5d6ff" "Tb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Te6edf3exitErrTb4b4b4(Te6edf3errTb4b4b4)
Tb4b4b4}
Tff7b72if Te6edf3err Tff7b72:= Te6edf3osTb4b4b4.Te6edf3WriteFileTb4b4b4(Te6edf3reportPathTb4b4b4, Tffa657appendTb4b4b4(Te6edf3reportBytesTb4b4b4, Ta5d6ff'\n'Tb4b4b4)Tb4b4b4, T79c0ff0Te6edf3o644Tb4b4b4)Tb4b4b4; Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Te6edf3exitErrTb4b4b4(Te6edf3errTb4b4b4)
Tb4b4b4}
Te6edf3fmtTb4b4b4.Te6edf3PrintfTb4b4b4(Ta5d6ff"Analyzed files: %d\n"Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3resultsTb4b4b4)Tb4b4b4)
Te6edf3fmtTb4b4b4.Te6edf3PrintfTb4b4b4(Ta5d6ff"License counts -> %s\n"Tb4b4b4, Te6edf3formatCountSummaryTb4b4b4(Te6edf3classCountsTb4b4b4, Tffa657float64Tb4b4b4(Tffa657lenTb4b4b4(Te6edf3resultsTb4b4b4)Tb4b4b4)Tb4b4b4)Tb4b4b4)
Te6edf3fmtTb4b4b4.Te6edf3PrintfTb4b4b4(Ta5d6ff"JSON report: %s\n"Tb4b4b4, Te6edf3reportPathTb4b4b4)
Tff7b72if Te6edf3cfgTb4b4b4.Te6edf3writeHeaders Tb4b4b4{
Te6edf3fmtTb4b4b4.Te6edf3PrintfTb4b4b4(Ta5d6ff"Headers updated (%s): %d\n"Tb4b4b4, Te6edf3cfgTb4b4b4.Te6edf3headerExtsRawTb4b4b4, Te6edf3headersUpdatedTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72func Te6edf3parseConfigTb4b4b4(Tb4b4b4) Tb4b4b4(Te6edf3configTb4b4b4, Tffa657errorTb4b4b4) Tb4b4b4{
Te6edf3cfg Tff7b72:= Te6edf3configTb4b4b4{Tb4b4b4}
Te6edf3flagTb4b4b4.Te6edf3StringVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3repoRootTb4b4b4, Ta5d6ff"repo-root"Tb4b4b4, Te6edf3envStringTb4b4b4(Ta5d6ff"REPO_ROOT"Tb4b4b4, Ta5d6ff"."Tb4b4b4)Tb4b4b4, Ta5d6ff"Path to repository root"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3StringVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3upstreamPathTb4b4b4, Ta5d6ff"upstream-path"Tb4b4b4, Te6edf3envStringTb4b4b4(Ta5d6ff"UPSTREAM_PATH"Tb4b4b4, Ta5d6ff""Tb4b4b4)Tb4b4b4, Ta5d6ff"Path to local upstream checkout"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3StringVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3upstreamURLTb4b4b4, Ta5d6ff"upstream-url"Tb4b4b4, Te6edf3envStringTb4b4b4(Ta5d6ff"UPSTREAM_URL"Tb4b4b4, Te6edf3defaultUpstreamURLTb4b4b4)Tb4b4b4, Ta5d6ff"Upstream git URL"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3StringVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3upstreamBranchTb4b4b4, Ta5d6ff"upstream-branch"Tb4b4b4, Te6edf3envStringTb4b4b4(Ta5d6ff"UPSTREAM_BRANCH"Tb4b4b4, Ta5d6ff"master"Tb4b4b4)Tb4b4b4, Ta5d6ff"Upstream branch"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3DurationVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3cloneTimeoutTb4b4b4, Ta5d6ff"clone-timeout"Tb4b4b4, Te6edf3envDurationTb4b4b4(Ta5d6ff"CLONE_TIMEOUT"Tb4b4b4, T79c0ff2Tff7b72*Te6edf3timeTb4b4b4.Te6edf3MinuteTb4b4b4)Tb4b4b4, Ta5d6ff"Timeout for upstream clone"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3StringVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3scanExtsRawTb4b4b4, Ta5d6ff"scan-exts"Tb4b4b4, Te6edf3envStringTb4b4b4(Ta5d6ff"SCAN_EXTS"Tb4b4b4, Ta5d6ff".py,.vue"Tb4b4b4)Tb4b4b4, Ta5d6ff"Comma-separated extensions for similarity analysis"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3StringVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3headerExtsRawTb4b4b4, Ta5d6ff"header-exts"Tb4b4b4, Te6edf3envStringTb4b4b4(Ta5d6ff"HEADER_EXTS"Tb4b4b4, Ta5d6ff".py,.vue"Tb4b4b4)Tb4b4b4, Ta5d6ff"Comma-separated extensions eligible for SPDX headers"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3StringVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3excludeDirsRawTb4b4b4, Ta5d6ff"exclude-dirs"Tb4b4b4, Te6edf3envStringTb4b4b4(Ta5d6ff"EXCLUDE_DIRS"Tb4b4b4, Ta5d6ff".git,.idea,.vscode,.local,.pnpm-store,.flatpak-builder,node_modules,dist,build,.venv,venv,__pycache__,.pytest_cache,.mypy_cache,.ruff_cache"Tb4b4b4)Tb4b4b4, Ta5d6ff"Comma-separated directories to skip"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3StringVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3excludePathsRawTb4b4b4, Ta5d6ff"exclude-path-contains"Tb4b4b4, Te6edf3envStringTb4b4b4(Ta5d6ff"EXCLUDE_PATH_CONTAINS"Tb4b4b4, Ta5d6ff""Tb4b4b4)Tb4b4b4, Ta5d6ff"Comma-separated path substrings to skip"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3Int64VarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3maxFileSizeBytesTb4b4b4, Ta5d6ff"max-file-size-bytes"Tb4b4b4, Te6edf3envInt64Tb4b4b4(Ta5d6ff"MAX_FILE_SIZE_BYTES"Tb4b4b4, T79c0ff2Te6edf3_000_000Tb4b4b4)Tb4b4b4, Ta5d6ff"Max file size for analysis"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3Float64VarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3mitThresholdTb4b4b4, Ta5d6ff"mit-threshold"Tb4b4b4, Te6edf3envFloatTb4b4b4(Ta5d6ff"MIT_THRESHOLD"Tb4b4b4, T79c0ff0.85Tb4b4b4)Tb4b4b4, Ta5d6ff"Composite similarity threshold for MIT"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3Float64VarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3mixedThresholdTb4b4b4, Ta5d6ff"mixed-threshold"Tb4b4b4, Te6edf3envFloatTb4b4b4(Ta5d6ff"MIXED_THRESHOLD"Tb4b4b4, T79c0ff0.25Tb4b4b4)Tb4b4b4, Ta5d6ff"Composite similarity threshold for mixed license"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3BoolVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3allowPure0BSDTb4b4b4, Ta5d6ff"allow-pure-0bsd"Tb4b4b4, Te6edf3envBoolTb4b4b4(Ta5d6ff"ALLOW_PURE_0BSD"Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4, Ta5d6ff"Allow pure 0BSD classification for files with very low similarity and no direct path match. Disabled by default because textual similarity is not a legal test for derivative-work status."Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3BoolVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3pure0BSDConfirmNoDerivationTb4b4b4, Ta5d6ff"pure-0bsd-confirm-no-derivation"Tb4b4b4, Te6edf3envBoolTb4b4b4(Ta5d6ff"PURE_0BSD_CONFIRM_NO_DERIVATION"Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4, Ta5d6ff"Required acknowledgement that files classified as pure 0BSD are not derivative works of upstream sources. Without this flag --allow-pure-0bsd is ignored."Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3Float64VarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3pure0BSDThresholdTb4b4b4, Ta5d6ff"pure-0bsd-threshold"Tb4b4b4, Te6edf3envFloatTb4b4b4(Ta5d6ff"PURE_0BSD_THRESHOLD"Tb4b4b4, T79c0ff1.0Tb4b4b4)Tb4b4b4, Ta5d6ff"Max similarity percent for pure 0BSD"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3StringVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3baseLicenseTb4b4b4, Ta5d6ff"base-license"Tb4b4b4, Te6edf3envStringTb4b4b4(Ta5d6ff"BASE_LICENSE"Tb4b4b4, Ta5d6ff"0BSD AND MIT"Tb4b4b4)Tb4b4b4, Ta5d6ff"Default SPDX license below mixed threshold"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3IntVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3maxNameCandidatesTb4b4b4, Ta5d6ff"max-name-candidates"Tb4b4b4, Te6edf3envIntTb4b4b4(Ta5d6ff"MAX_NAME_CANDIDATES"Tb4b4b4, T79c0ff200Tb4b4b4)Tb4b4b4, Ta5d6ff"Max basename candidates when direct path match missing"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3BoolVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3writeHeadersTb4b4b4, Ta5d6ff"write-headers"Tb4b4b4, Te6edf3envBoolTb4b4b4(Ta5d6ff"WRITE_HEADERS"Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4, Ta5d6ff"Write SPDX headers"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3BoolVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3replaceExistingTb4b4b4, Ta5d6ff"replace-existing"Tb4b4b4, Te6edf3envBoolTb4b4b4(Ta5d6ff"REPLACE_EXISTING"Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4, Ta5d6ff"Replace existing SPDX header"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3BoolVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3cleanNonTargetTb4b4b4, Ta5d6ff"clean-non-target-spdx"Tb4b4b4, Te6edf3envBoolTb4b4b4(Ta5d6ff"CLEAN_NON_TARGET_SPDX"Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4, Ta5d6ff"Remove SPDX headers from files outside header-exts"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3StringVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3overridesPathTb4b4b4, Ta5d6ff"overrides"Tb4b4b4, Te6edf3envStringTb4b4b4(Ta5d6ff"OVERRIDES"Tb4b4b4, Ta5d6ff""Tb4b4b4)Tb4b4b4, Ta5d6ff"Path to JSON map of relpath->SPDX"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3StringVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3reportJSONTb4b4b4, Ta5d6ff"report-json"Tb4b4b4, Te6edf3envStringTb4b4b4(Ta5d6ff"REPORT_JSON"Tb4b4b4, Ta5d6ff"license-scope-report.json"Tb4b4b4)Tb4b4b4, Ta5d6ff"JSON report output path"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3StringVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3explainPathsRawTb4b4b4, Ta5d6ff"explain-paths"Tb4b4b4, Te6edf3envStringTb4b4b4(Ta5d6ff"EXPLAIN_PATHS"Tb4b4b4, Ta5d6ff""Tb4b4b4)Tb4b4b4, Ta5d6ff"Comma-separated repo-relative paths to explain scoring decisions"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3BoolVarTb4b4b4(Tff7b72&Te6edf3cfgTb4b4b4.Te6edf3explainAllTb4b4b4, Ta5d6ff"explain-all"Tb4b4b4, Te6edf3envBoolTb4b4b4(Ta5d6ff"EXPLAIN_ALL"Tb4b4b4, Tff7b72falseTb4b4b4)Tb4b4b4, Ta5d6ff"Print scoring explanation for every analyzed file"Tb4b4b4)
Te6edf3flagTb4b4b4.Te6edf3ParseTb4b4b4(Tb4b4b4)
Te6edf3cfgTb4b4b4.Te6edf3scanExts Tb4b4b4= Te6edf3parseExtSetTb4b4b4(Te6edf3cfgTb4b4b4.Te6edf3scanExtsRawTb4b4b4)
Te6edf3cfgTb4b4b4.Te6edf3headerExts Tb4b4b4= Te6edf3parseExtSetTb4b4b4(Te6edf3cfgTb4b4b4.Te6edf3headerExtsRawTb4b4b4)
Te6edf3cfgTb4b4b4.Te6edf3excludedDirs Tb4b4b4= Te6edf3parseStringSetTb4b4b4(Te6edf3cfgTb4b4b4.Te6edf3excludeDirsRawTb4b4b4)
Te6edf3cfgTb4b4b4.Te6edf3excludedContains Tb4b4b4= Te6edf3parseStringListTb4b4b4(Te6edf3cfgTb4b4b4.Te6edf3excludePathsRawTb4b4b4)
Te6edf3cfgTb4b4b4.Te6edf3explainPaths Tb4b4b4= Te6edf3parsePathSetTb4b4b4(Te6edf3cfgTb4b4b4.Te6edf3explainPathsRawTb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3cfgTb4b4b4.Te6edf3scanExtsTb4b4b4) Tff7b72== T79c0ff0 Tb4b4b4{
Tff7b72return Te6edf3cfgTb4b4b4, Te6edf3errorsTb4b4b4.Te6edf3NewTb4b4b4(Ta5d6ff"scan-exts must include at least one extension"Tb4b4b4)
Tb4b4b4}
Tff7b72if Tffa657lenTb4b4b4(Te6edf3cfgTb4b4b4.Te6edf3headerExtsTb4b4b4) Tff7b72== T79c0ff0 Tb4b4b4{
Tff7b72return Te6edf3cfgTb4b4b4, Te6edf3errorsTb4b4b4.Te6edf3NewTb4b4b4(Ta5d6ff"header-exts must include at least one extension"Tb4b4b4)
Tb4b4b4}
Tff7b72if Te6edf3cfgTb4b4b4.Te6edf3mixedThreshold Tb4b4b4< T79c0ff0 Tff7b72|| Te6edf3cfgTb4b4b4.Te6edf3mitThreshold Tb4b4b4< T79c0ff0 Tff7b72|| Te6edf3cfgTb4b4b4.Te6edf3mitThreshold Tb4b4b4> T79c0ff1 Tff7b72|| Te6edf3cfgTb4b4b4.Te6edf3mixedThreshold Tb4b4b4> Te6edf3cfgTb4b4b4.Te6edf3mitThreshold Tb4b4b4{
Tff7b72return Te6edf3cfgTb4b4b4, Te6edf3errorsTb4b4b4.Te6edf3NewTb4b4b4(Ta5d6ff"thresholds must satisfy 0 <= mixed-threshold <= mit-threshold <= 1"Tb4b4b4)
Tb4b4b4}
Tff7b72if Te6edf3cfgTb4b4b4.Te6edf3pure0BSDThreshold Tb4b4b4< T79c0ff0 Tff7b72|| Te6edf3cfgTb4b4b4.Te6edf3pure0BSDThreshold Tb4b4b4> T79c0ff100 Tb4b4b4{
Tff7b72return Te6edf3cfgTb4b4b4, Te6edf3errorsTb4b4b4.Te6edf3NewTb4b4b4(Ta5d6ff"pure-0bsd-threshold must be in [0,100] percent"Tb4b4b4)
Tb4b4b4}
Tff7b72return Te6edf3cfgTb4b4b4, Tff7b72nil
Tb4b4b4}
Tff7b72func Te6edf3envKeyTb4b4b4(Te6edf3name Tffa657stringTb4b4b4) Tffa657string Tb4b4b4{ Tff7b72return Te6edf3envPrefix Tff7b72+ Te6edf3name Tb4b4b4}
Tff7b72func Te6edf3envStringTb4b4b4(Te6edf3nameTb4b4b4, Te6edf3fallback Tffa657stringTb4b4b4) Tffa657string Tb4b4b4{
Tff7b72if Te6edf3vTb4b4b4, Te6edf3ok Tff7b72:= Te6edf3osTb4b4b4.Te6edf3LookupEnvTb4b4b4(Te6edf3envKeyTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4)Tb4b4b4; Te6edf3ok Tb4b4b4{
Tff7b72return Te6edf3v
Tb4b4b4}
Tff7b72return Te6edf3fallback
Tb4b4b4}
Tff7b72func Te6edf3envBoolTb4b4b4(Te6edf3name Tffa657stringTb4b4b4, Te6edf3fallback Tffa657boolTb4b4b4) Tffa657bool Tb4b4b4{
Tff7b72if Te6edf3vTb4b4b4, Te6edf3ok Tff7b72:= Te6edf3osTb4b4b4.Te6edf3LookupEnvTb4b4b4(Te6edf3envKeyTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4)Tb4b4b4; Te6edf3ok Tb4b4b4{
Te6edf3bTb4b4b4, Te6edf3err Tff7b72:= Te6edf3strconvTb4b4b4.Te6edf3ParseBoolTb4b4b4(Te6edf3stringsTb4b4b4.Te6edf3TrimSpaceTb4b4b4(Te6edf3vTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3err Tff7b72== Tff7b72nil Tb4b4b4{
Tff7b72return Te6edf3b
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3fallback
Tb4b4b4}
Tff7b72func Te6edf3envIntTb4b4b4(Te6edf3name Tffa657stringTb4b4b4, Te6edf3fallback Tffa657intTb4b4b4) Tffa657int Tb4b4b4{
Tff7b72if Te6edf3vTb4b4b4, Te6edf3ok Tff7b72:= Te6edf3osTb4b4b4.Te6edf3LookupEnvTb4b4b4(Te6edf3envKeyTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4)Tb4b4b4; Te6edf3ok Tb4b4b4{
Te6edf3iTb4b4b4, Te6edf3err Tff7b72:= Te6edf3strconvTb4b4b4.Te6edf3AtoiTb4b4b4(Te6edf3stringsTb4b4b4.Te6edf3TrimSpaceTb4b4b4(Te6edf3vTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3err Tff7b72== Tff7b72nil Tb4b4b4{
Tff7b72return Te6edf3i
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3fallback
Tb4b4b4}
Tff7b72func Te6edf3envInt64Tb4b4b4(Te6edf3name Tffa657stringTb4b4b4, Te6edf3fallback Tffa657int64Tb4b4b4) Tffa657int64 Tb4b4b4{
Tff7b72if Te6edf3vTb4b4b4, Te6edf3ok Tff7b72:= Te6edf3osTb4b4b4.Te6edf3LookupEnvTb4b4b4(Te6edf3envKeyTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4)Tb4b4b4; Te6edf3ok Tb4b4b4{
Te6edf3iTb4b4b4, Te6edf3err Tff7b72:= Te6edf3strconvTb4b4b4.Te6edf3ParseIntTb4b4b4(Te6edf3stringsTb4b4b4.Te6edf3TrimSpaceTb4b4b4(Te6edf3vTb4b4b4)Tb4b4b4, T79c0ff10Tb4b4b4, T79c0ff64Tb4b4b4)
Tff7b72if Te6edf3err Tff7b72== Tff7b72nil Tb4b4b4{
Tff7b72return Te6edf3i
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3fallback
Tb4b4b4}
Tff7b72func Te6edf3envFloatTb4b4b4(Te6edf3name Tffa657stringTb4b4b4, Te6edf3fallback Tffa657float64Tb4b4b4) Tffa657float64 Tb4b4b4{
Tff7b72if Te6edf3vTb4b4b4, Te6edf3ok Tff7b72:= Te6edf3osTb4b4b4.Te6edf3LookupEnvTb4b4b4(Te6edf3envKeyTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4)Tb4b4b4; Te6edf3ok Tb4b4b4{
Te6edf3fTb4b4b4, Te6edf3err Tff7b72:= Te6edf3strconvTb4b4b4.Te6edf3ParseFloatTb4b4b4(Te6edf3stringsTb4b4b4.Te6edf3TrimSpaceTb4b4b4(Te6edf3vTb4b4b4)Tb4b4b4, T79c0ff64Tb4b4b4)
Tff7b72if Te6edf3err Tff7b72== Tff7b72nil Tb4b4b4{
Tff7b72return Te6edf3f
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3fallback
Tb4b4b4}
Tff7b72func Te6edf3envDurationTb4b4b4(Te6edf3name Tffa657stringTb4b4b4, Te6edf3fallback Te6edf3timeTb4b4b4.Te6edf3DurationTb4b4b4) Te6edf3timeTb4b4b4.Te6edf3Duration Tb4b4b4{
Tff7b72if Te6edf3vTb4b4b4, Te6edf3ok Tff7b72:= Te6edf3osTb4b4b4.Te6edf3LookupEnvTb4b4b4(Te6edf3envKeyTb4b4b4(Te6edf3nameTb4b4b4)Tb4b4b4)Tb4b4b4; Te6edf3ok Tb4b4b4{
Te6edf3dTb4b4b4, Te6edf3err Tff7b72:= Te6edf3timeTb4b4b4.Te6edf3ParseDurationTb4b4b4(Te6edf3stringsTb4b4b4.Te6edf3TrimSpaceTb4b4b4(Te6edf3vTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3err Tff7b72== Tff7b72nil Tb4b4b4{
Tff7b72return Te6edf3d
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3fallback
Tb4b4b4}
Tff7b72func Te6edf3parseStringListTb4b4b4(Te6edf3raw Tffa657stringTb4b4b4) Tb4b4b4[Tb4b4b4]Tffa657string Tb4b4b4{
Te6edf3out Tff7b72:= Tb4b4b4[Tb4b4b4]Tffa657stringTb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3_Tb4b4b4, Te6edf3token Tff7b72:= Tff7b72range Te6edf3stringsTb4b4b4.Te6edf3SplitTb4b4b4(Te6edf3rawTb4b4b4, Ta5d6ff","Tb4b4b4) Tb4b4b4{
Te6edf3t Tff7b72:= Te6edf3stringsTb4b4b4.Te6edf3TrimSpaceTb4b4b4(Te6edf3tokenTb4b4b4)
Tff7b72if Te6edf3t Tff7b72!= Ta5d6ff"" Tb4b4b4{
Te6edf3out Tb4b4b4= Tffa657appendTb4b4b4(Te6edf3outTb4b4b4, Te6edf3tTb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3out
Tb4b4b4}
Tff7b72func Te6edf3parseStringSetTb4b4b4(Te6edf3raw Tffa657stringTb4b4b4) Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4} Tb4b4b4{
Te6edf3out Tff7b72:= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3_Tb4b4b4, Te6edf3t Tff7b72:= Tff7b72range Te6edf3parseStringListTb4b4b4(Te6edf3rawTb4b4b4) Tb4b4b4{
Te6edf3outTb4b4b4[Te6edf3tTb4b4b4] Tb4b4b4= Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4{Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3out
Tb4b4b4}
Tff7b72func Te6edf3parsePathSetTb4b4b4(Te6edf3raw Tffa657stringTb4b4b4) Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4} Tb4b4b4{
Te6edf3out Tff7b72:= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3_Tb4b4b4, Te6edf3p Tff7b72:= Tff7b72range Te6edf3parseStringListTb4b4b4(Te6edf3rawTb4b4b4) Tb4b4b4{
Te6edf3outTb4b4b4[Te6edf3filepathTb4b4b4.Te6edf3ToSlashTb4b4b4(Te6edf3stringsTb4b4b4.Te6edf3TrimSpaceTb4b4b4(Te6edf3pTb4b4b4)Tb4b4b4)Tb4b4b4] Tb4b4b4= Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4{Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3out
Tb4b4b4}
Tff7b72func Te6edf3parseExtSetTb4b4b4(Te6edf3raw Tffa657stringTb4b4b4) Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4} Tb4b4b4{
Te6edf3out Tff7b72:= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3_Tb4b4b4, Te6edf3token Tff7b72:= Tff7b72range Te6edf3parseStringListTb4b4b4(Te6edf3rawTb4b4b4) Tb4b4b4{
Te6edf3ext Tff7b72:= Te6edf3stringsTb4b4b4.Te6edf3ToLowerTb4b4b4(Te6edf3tokenTb4b4b4)
Tff7b72if Tb4b4b4!Te6edf3stringsTb4b4b4.Te6edf3HasPrefixTb4b4b4(Te6edf3extTb4b4b4, Ta5d6ff"."Tb4b4b4) Tb4b4b4{
Te6edf3ext Tb4b4b4= Ta5d6ff"." Tff7b72+ Te6edf3ext
Tb4b4b4}
Te6edf3outTb4b4b4[Te6edf3extTb4b4b4] Tb4b4b4= Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4{Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3out
Tb4b4b4}
Tff7b72func Te6edf3cloneUpstreamTb4b4b4(Te6edf3cfg Te6edf3configTb4b4b4, Te6edf3target Tffa657stringTb4b4b4) Tffa657error Tb4b4b4{
Te6edf3ctxTb4b4b4, Te6edf3cancel Tff7b72:= Te6edf3contextTb4b4b4.Te6edf3WithTimeoutTb4b4b4(Te6edf3contextTb4b4b4.Te6edf3BackgroundTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3cfgTb4b4b4.Te6edf3cloneTimeoutTb4b4b4)
Tff7b72defer Te6edf3cancelTb4b4b4(Tb4b4b4)
Te6edf3cmd Tff7b72:= Te6edf3execTb4b4b4.Te6edf3CommandContextTb4b4b4(Te6edf3ctxTb4b4b4, Ta5d6ff"git"Tb4b4b4, Ta5d6ff"clone"Tb4b4b4, Ta5d6ff"--depth"Tb4b4b4, Ta5d6ff"1"Tb4b4b4, Ta5d6ff"--branch"Tb4b4b4, Te6edf3cfgTb4b4b4.Te6edf3upstreamBranchTb4b4b4, Te6edf3cfgTb4b4b4.Te6edf3upstreamURLTb4b4b4, Te6edf3targetTb4b4b4)
Te6edf3cmdTb4b4b4.Te6edf3Stdout Tb4b4b4= Te6edf3osTb4b4b4.Te6edf3Stdout
Te6edf3cmdTb4b4b4.Te6edf3Stderr Tb4b4b4= Te6edf3osTb4b4b4.Te6edf3Stderr
Tff7b72if Te6edf3err Tff7b72:= Te6edf3cmdTb4b4b4.Te6edf3RunTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72if Te6edf3ctxTb4b4b4.Te6edf3ErrTb4b4b4(Tb4b4b4) Tff7b72== Te6edf3contextTb4b4b4.Te6edf3DeadlineExceeded Tb4b4b4{
Tff7b72return Te6edf3fmtTb4b4b4.Te6edf3ErrorfTb4b4b4(Ta5d6ff"git clone timed out after %s"Tb4b4b4, Te6edf3cfgTb4b4b4.Te6edf3cloneTimeoutTb4b4b4)
Tb4b4b4}
Tff7b72return Te6edf3err
Tb4b4b4}
Tff7b72return Tff7b72nil
Tb4b4b4}
Tff7b72func Te6edf3discoverFilesTb4b4b4(Te6edf3cfg Te6edf3configTb4b4b4, Te6edf3root Tffa657stringTb4b4b4) Tb4b4b4(Tb4b4b4[Tb4b4b4]Te6edf3fileDataTb4b4b4, Tffa657errorTb4b4b4) Tb4b4b4{
Te6edf3out Tff7b72:= Tb4b4b4[Tb4b4b4]Te6edf3fileDataTb4b4b4{Tb4b4b4}
Te6edf3err Tff7b72:= Te6edf3filepathTb4b4b4.Te6edf3WalkDirTb4b4b4(Te6edf3rootTb4b4b4, Tff7b72funcTb4b4b4(Te6edf3path Tffa657stringTb4b4b4, Te6edf3d Te6edf3fsTb4b4b4.Te6edf3DirEntryTb4b4b4, Te6edf3walkErr Tffa657errorTb4b4b4) Tffa657error Tb4b4b4{
Tff7b72if Te6edf3walkErr Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Te6edf3walkErr
Tb4b4b4}
Te6edf3name Tff7b72:= Te6edf3dTb4b4b4.Te6edf3NameTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3dTb4b4b4.Te6edf3IsDirTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Te6edf3_Tb4b4b4, Te6edf3skip Tff7b72:= Te6edf3cfgTb4b4b4.Te6edf3excludedDirsTb4b4b4[Te6edf3nameTb4b4b4]Tb4b4b4; Te6edf3skip Tb4b4b4{
Tff7b72return Te6edf3filepathTb4b4b4.Te6edf3SkipDir
Tb4b4b4}
Tff7b72return Tff7b72nil
Tb4b4b4}
Te6edf3relTb4b4b4, Te6edf3err Tff7b72:= Te6edf3filepathTb4b4b4.Te6edf3RelTb4b4b4(Te6edf3rootTb4b4b4, Te6edf3pathTb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Te6edf3err
Tb4b4b4}
Te6edf3rel Tb4b4b4= Te6edf3filepathTb4b4b4.Te6edf3ToSlashTb4b4b4(Te6edf3relTb4b4b4)
Tff7b72if Te6edf3shouldSkipFileTb4b4b4(Te6edf3cfgTb4b4b4, Te6edf3relTb4b4b4, Te6edf3pathTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nil
Tb4b4b4}
Te6edf3normHashTb4b4b4, Te6edf3lineSetTb4b4b4, Te6edf3bigramsTb4b4b4, Te6edf3s5Tb4b4b4, Te6edf3s7Tb4b4b4, Te6edf3err Tff7b72:= Te6edf3loadAndNormalizeTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Tff7b72nil
Tb4b4b4}
Te6edf3out Tb4b4b4= Tffa657appendTb4b4b4(Te6edf3outTb4b4b4, Te6edf3fileDataTb4b4b4{
Te6edf3absPathTb4b4b4: Te6edf3pathTb4b4b4,
Te6edf3relPathTb4b4b4: Te6edf3relTb4b4b4,
Te6edf3baseNameTb4b4b4: Te6edf3filepathTb4b4b4.Te6edf3BaseTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4,
Te6edf3normHashTb4b4b4: Te6edf3normHashTb4b4b4,
Te6edf3lineSetTb4b4b4: Te6edf3lineSetTb4b4b4,
Te6edf3bigramSetTb4b4b4: Te6edf3bigramsTb4b4b4,
Te6edf3shingle5SetTb4b4b4: Te6edf3s5Tb4b4b4,
Te6edf3shingle7SetTb4b4b4: Te6edf3s7Tb4b4b4,
Tb4b4b4}Tb4b4b4)
Tff7b72return Tff7b72nil
Tb4b4b4}Tb4b4b4)
Tff7b72return Te6edf3outTb4b4b4, Te6edf3err
Tb4b4b4}
Tff7b72func Te6edf3shouldSkipFileTb4b4b4(Te6edf3cfg Te6edf3configTb4b4b4, Te6edf3relTb4b4b4, Te6edf3abs Tffa657stringTb4b4b4) Tffa657bool Tb4b4b4{
Tff7b72for Te6edf3_Tb4b4b4, Te6edf3part Tff7b72:= Tff7b72range Te6edf3cfgTb4b4b4.Te6edf3excludedContains Tb4b4b4{
Tff7b72if Te6edf3stringsTb4b4b4.Te6edf3ContainsTb4b4b4(Te6edf3relTb4b4b4, Te6edf3partTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72true
Tb4b4b4}
Tb4b4b4}
Te6edf3ext Tff7b72:= Te6edf3stringsTb4b4b4.Te6edf3ToLowerTb4b4b4(Te6edf3filepathTb4b4b4.Te6edf3ExtTb4b4b4(Te6edf3absTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3_Tb4b4b4, Te6edf3ok Tff7b72:= Te6edf3cfgTb4b4b4.Te6edf3scanExtsTb4b4b4[Te6edf3extTb4b4b4]Tb4b4b4; Tb4b4b4!Te6edf3ok Tb4b4b4{
Tff7b72return Tff7b72true
Tb4b4b4}
Tff7b72if Te6edf3_Tb4b4b4, Te6edf3ok Tff7b72:= Te6edf3commentStyleByExtTb4b4b4[Te6edf3extTb4b4b4]Tb4b4b4; Tb4b4b4!Te6edf3ok Tb4b4b4{
Tff7b72return Tff7b72true
Tb4b4b4}
Te6edf3infoTb4b4b4, Te6edf3err Tff7b72:= Te6edf3osTb4b4b4.Te6edf3StatTb4b4b4(Te6edf3absTb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Tff7b72true
Tb4b4b4}
Tff7b72if Te6edf3infoTb4b4b4.Te6edf3SizeTb4b4b4(Tb4b4b4) Tb4b4b4> Te6edf3cfgTb4b4b4.Te6edf3maxFileSizeBytes Tb4b4b4{
Tff7b72return Tff7b72true
Tb4b4b4}
Tff7b72return Tff7b72false
Tb4b4b4}
Tff7b72func Te6edf3loadAndNormalizeTb4b4b4(Te6edf3path Tffa657stringTb4b4b4) Tb4b4b4(Tffa657stringTb4b4b4, Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4, Tff7b72mapTb4b4b4[Tffa657uint64Tb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4, Tff7b72mapTb4b4b4[Tffa657uint64Tb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4, Tff7b72mapTb4b4b4[Tffa657uint64Tb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4, Tffa657errorTb4b4b4) Tb4b4b4{
Te6edf3rawTb4b4b4, Te6edf3err Tff7b72:= Te6edf3osTb4b4b4.Te6edf3ReadFileTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Ta5d6ff""Tb4b4b4, Tff7b72nilTb4b4b4, Tff7b72nilTb4b4b4, Tff7b72nilTb4b4b4, Tff7b72nilTb4b4b4, Te6edf3err
Tb4b4b4}
Tff7b72if Te6edf3bytesTb4b4b4.Te6edf3IndexByteTb4b4b4(Te6edf3rawTb4b4b4, T79c0ff0Tb4b4b4) Tff7b72>= T79c0ff0 Tb4b4b4{
Tff7b72return Ta5d6ff""Tb4b4b4, Tff7b72nilTb4b4b4, Tff7b72nilTb4b4b4, Tff7b72nilTb4b4b4, Tff7b72nilTb4b4b4, Te6edf3errorsTb4b4b4.Te6edf3NewTb4b4b4(Ta5d6ff"binary file"Tb4b4b4)
Tb4b4b4}
Te6edf3sc Tff7b72:= Te6edf3bufioTb4b4b4.Te6edf3NewScannerTb4b4b4(Te6edf3bytesTb4b4b4.Te6edf3NewReaderTb4b4b4(Te6edf3rawTb4b4b4)Tb4b4b4)
Te6edf3scTb4b4b4.Te6edf3BufferTb4b4b4(Tffa657makeTb4b4b4(Tb4b4b4[Tb4b4b4]Tffa657byteTb4b4b4, T79c0ff0Tb4b4b4, T79c0ff64Tff7b72*T79c0ff1024Tb4b4b4)Tb4b4b4, T79c0ff4Tff7b72*T79c0ff1024Tff7b72*T79c0ff1024Tb4b4b4)
Te6edf3lines Tff7b72:= Tb4b4b4[Tb4b4b4]Tffa657stringTb4b4b4{Tb4b4b4}
Te6edf3lineSet Tff7b72:= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3scTb4b4b4.Te6edf3ScanTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3line Tff7b72:= Te6edf3scTb4b4b4.Te6edf3TextTb4b4b4(Tb4b4b4)
Tff7b72if Te6edf3stringsTb4b4b4.Te6edf3ContainsTb4b4b4(Te6edf3lineTb4b4b4, Ta5d6ff"SPDX-License-Identifier:"Tb4b4b4) Tb4b4b4{
Tff7b72continue
Tb4b4b4}
Te6edf3norm Tff7b72:= Te6edf3stringsTb4b4b4.Te6edf3ToLowerTb4b4b4(Te6edf3stringsTb4b4b4.Te6edf3TrimSpaceTb4b4b4(Te6edf3lineTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3norm Tff7b72== Ta5d6ff"" Tb4b4b4{
Tff7b72continue
Tb4b4b4}
Te6edf3lines Tb4b4b4= Tffa657appendTb4b4b4(Te6edf3linesTb4b4b4, Te6edf3normTb4b4b4)
Te6edf3lineSetTb4b4b4[Te6edf3normTb4b4b4] Tb4b4b4= Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4{Tb4b4b4}
Tb4b4b4}
Tff7b72if Te6edf3err Tff7b72:= Te6edf3scTb4b4b4.Te6edf3ErrTb4b4b4(Tb4b4b4)Tb4b4b4; Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Ta5d6ff""Tb4b4b4, Tff7b72nilTb4b4b4, Tff7b72nilTb4b4b4, Tff7b72nilTb4b4b4, Tff7b72nilTb4b4b4, Te6edf3err
Tb4b4b4}
Te6edf3sum Tff7b72:= Te6edf3sha256Tb4b4b4.Te6edf3Sum256Tb4b4b4(Tb4b4b4[Tb4b4b4]Tffa657byteTb4b4b4(Te6edf3stringsTb4b4b4.Te6edf3JoinTb4b4b4(Te6edf3linesTb4b4b4, Ta5d6ff"\n"Tb4b4b4)Tb4b4b4)Tb4b4b4)
Tff7b72return Te6edf3hexTb4b4b4.Te6edf3EncodeToStringTb4b4b4(Te6edf3sumTb4b4b4[Tb4b4b4:Tb4b4b4]Tb4b4b4)Tb4b4b4, Te6edf3lineSetTb4b4b4, Te6edf3makeNGramSetTb4b4b4(Te6edf3linesTb4b4b4, T79c0ff2Tb4b4b4)Tb4b4b4, Te6edf3makeNGramSetTb4b4b4(Te6edf3linesTb4b4b4, T79c0ff5Tb4b4b4)Tb4b4b4, Te6edf3makeNGramSetTb4b4b4(Te6edf3linesTb4b4b4, T79c0ff7Tb4b4b4)Tb4b4b4, Tff7b72nil
Tb4b4b4}
Tff7b72func Te6edf3findBestMatchTb4b4b4(Te6edf3local Te6edf3fileDataTb4b4b4, Te6edf3byRel Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Te6edf3fileDataTb4b4b4, Te6edf3byBase Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tb4b4b4[Tb4b4b4]Te6edf3fileDataTb4b4b4, Te6edf3maxCandidates Tffa657intTb4b4b4) Te6edf3matchResult Tb4b4b4{
Te6edf3best Tff7b72:= Te6edf3matchResultTb4b4b4{Tb4b4b4}
Tff7b72if Te6edf3directTb4b4b4, Te6edf3ok Tff7b72:= Te6edf3byRelTb4b4b4[Te6edf3localTb4b4b4.Te6edf3relPathTb4b4b4]Tb4b4b4; Te6edf3ok Tb4b4b4{
Te6edf3best Tb4b4b4= Te6edf3similarityDetailTb4b4b4(Te6edf3localTb4b4b4, Te6edf3directTb4b4b4)
Te6edf3bestTb4b4b4.Te6edf3upstreamRelPath Tb4b4b4= Te6edf3directTb4b4b4.Te6edf3relPath
Te6edf3bestTb4b4b4.Te6edf3directPathMatch Tb4b4b4= Tff7b72true
Tb4b4b4}
Te6edf3candidates Tff7b72:= Te6edf3byBaseTb4b4b4[Te6edf3localTb4b4b4.Te6edf3baseNameTb4b4b4]
Tff7b72if Tffa657lenTb4b4b4(Te6edf3candidatesTb4b4b4) Tb4b4b4> Te6edf3maxCandidates Tb4b4b4{
Te6edf3candidates Tb4b4b4= Te6edf3candidatesTb4b4b4[Tb4b4b4:Te6edf3maxCandidatesTb4b4b4]
Tb4b4b4}
Tff7b72for Te6edf3_Tb4b4b4, Te6edf3cand Tff7b72:= Tff7b72range Te6edf3candidates Tb4b4b4{
Tff7b72if Te6edf3candTb4b4b4.Te6edf3relPath Tff7b72== Te6edf3bestTb4b4b4.Te6edf3upstreamRelPath Tb4b4b4{
Tff7b72continue
Tb4b4b4}
Te6edf3d Tff7b72:= Te6edf3similarityDetailTb4b4b4(Te6edf3localTb4b4b4, Te6edf3candTb4b4b4)
Tff7b72if Te6edf3dTb4b4b4.Te6edf3similarityPct Tb4b4b4> Te6edf3bestTb4b4b4.Te6edf3similarityPct Tb4b4b4{
Te6edf3dTb4b4b4.Te6edf3upstreamRelPath Tb4b4b4= Te6edf3candTb4b4b4.Te6edf3relPath
Te6edf3dTb4b4b4.Te6edf3directPathMatch Tb4b4b4= Te6edf3candTb4b4b4.Te6edf3relPath Tff7b72== Te6edf3localTb4b4b4.Te6edf3relPath
Te6edf3best Tb4b4b4= Te6edf3d
Tb4b4b4}
Tb4b4b4}
Tff7b72if Te6edf3bestTb4b4b4.Te6edf3upstreamRelPath Tff7b72== Te6edf3localTb4b4b4.Te6edf3relPath Tff7b72&& Te6edf3bestTb4b4b4.Te6edf3upstreamRelPath Tff7b72!= Ta5d6ff"" Tb4b4b4{
Te6edf3bestTb4b4b4.Te6edf3directPathMatch Tb4b4b4= Tff7b72true
Tb4b4b4}
Tff7b72return Te6edf3best
Tb4b4b4}
Tff7b72func Te6edf3similarityDetailTb4b4b4(Te6edf3aTb4b4b4, Te6edf3b Te6edf3fileDataTb4b4b4) Te6edf3matchResult Tb4b4b4{
Tff7b72if Te6edf3aTb4b4b4.Te6edf3normHash Tff7b72!= Ta5d6ff"" Tff7b72&& Te6edf3aTb4b4b4.Te6edf3normHash Tff7b72== Te6edf3bTb4b4b4.Te6edf3normHash Tb4b4b4{
Tff7b72return Te6edf3matchResultTb4b4b4{
Te6edf3similarityPctTb4b4b4: T79c0ff100Tb4b4b4,
Te6edf3lineJaccardPctTb4b4b4: T79c0ff100Tb4b4b4,
Te6edf3bigramDicePctTb4b4b4: T79c0ff100Tb4b4b4,
Te6edf3shingle5PctTb4b4b4: T79c0ff100Tb4b4b4,
Te6edf3shingle7PctTb4b4b4: T79c0ff100Tb4b4b4,
Te6edf3lineCommonTb4b4b4: Tffa657lenTb4b4b4(Te6edf3aTb4b4b4.Te6edf3lineSetTb4b4b4)Tb4b4b4,
Te6edf3lineUnionTb4b4b4: Tffa657lenTb4b4b4(Te6edf3aTb4b4b4.Te6edf3lineSetTb4b4b4)Tb4b4b4,
Te6edf3bigramCommonTb4b4b4: Tffa657lenTb4b4b4(Te6edf3aTb4b4b4.Te6edf3bigramSetTb4b4b4)Tb4b4b4,
Te6edf3bigramTotalTb4b4b4: Tffa657lenTb4b4b4(Te6edf3aTb4b4b4.Te6edf3bigramSetTb4b4b4) Tff7b72+ Tffa657lenTb4b4b4(Te6edf3bTb4b4b4.Te6edf3bigramSetTb4b4b4)Tb4b4b4,
Te6edf3shingle5CommonTb4b4b4: Tffa657lenTb4b4b4(Te6edf3aTb4b4b4.Te6edf3shingle5SetTb4b4b4)Tb4b4b4,
Te6edf3shingle5UnionTb4b4b4: Tffa657lenTb4b4b4(Te6edf3aTb4b4b4.Te6edf3shingle5SetTb4b4b4)Tb4b4b4,
Te6edf3shingle7CommonTb4b4b4: Tffa657lenTb4b4b4(Te6edf3aTb4b4b4.Te6edf3shingle7SetTb4b4b4)Tb4b4b4,
Te6edf3shingle7UnionTb4b4b4: Tffa657lenTb4b4b4(Te6edf3aTb4b4b4.Te6edf3shingle7SetTb4b4b4)Tb4b4b4,
Tb4b4b4}
Tb4b4b4}
Te6edf3lineJTb4b4b4, Te6edf3lineCommonTb4b4b4, Te6edf3lineUnion Tff7b72:= Te6edf3setJaccardPctWithCountsTb4b4b4(Te6edf3aTb4b4b4.Te6edf3lineSetTb4b4b4, Te6edf3bTb4b4b4.Te6edf3lineSetTb4b4b4)
Te6edf3biDTb4b4b4, Te6edf3biCommonTb4b4b4, Te6edf3biTotal Tff7b72:= Te6edf3setDicePctWithCountsTb4b4b4(Te6edf3aTb4b4b4.Te6edf3bigramSetTb4b4b4, Te6edf3bTb4b4b4.Te6edf3bigramSetTb4b4b4)
Te6edf3sh5Tb4b4b4, Te6edf3sh5CommonTb4b4b4, Te6edf3sh5Union Tff7b72:= Te6edf3setJaccardPctWithCountsTb4b4b4(Te6edf3aTb4b4b4.Te6edf3shingle5SetTb4b4b4, Te6edf3bTb4b4b4.Te6edf3shingle5SetTb4b4b4)
Te6edf3sh7Tb4b4b4, Te6edf3sh7CommonTb4b4b4, Te6edf3sh7Union Tff7b72:= Te6edf3setJaccardPctWithCountsTb4b4b4(Te6edf3aTb4b4b4.Te6edf3shingle7SetTb4b4b4, Te6edf3bTb4b4b4.Te6edf3shingle7SetTb4b4b4)
Te6edf3composite Tff7b72:= Te6edf3combineCompositeTb4b4b4(Te6edf3lineJTb4b4b4, Te6edf3biDTb4b4b4, Te6edf3sh5Tb4b4b4, Te6edf3sh7Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3aTb4b4b4.Te6edf3bigramSetTb4b4b4) Tb4b4b4> T79c0ff0 Tff7b72&& Tffa657lenTb4b4b4(Te6edf3bTb4b4b4.Te6edf3bigramSetTb4b4b4) Tb4b4b4> T79c0ff0Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3aTb4b4b4.Te6edf3shingle5SetTb4b4b4) Tb4b4b4> T79c0ff0 Tff7b72&& Tffa657lenTb4b4b4(Te6edf3bTb4b4b4.Te6edf3shingle5SetTb4b4b4) Tb4b4b4> T79c0ff0Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3aTb4b4b4.Te6edf3shingle7SetTb4b4b4) Tb4b4b4> T79c0ff0 Tff7b72&& Tffa657lenTb4b4b4(Te6edf3bTb4b4b4.Te6edf3shingle7SetTb4b4b4) Tb4b4b4> T79c0ff0Tb4b4b4)
Tff7b72return Te6edf3matchResultTb4b4b4{
Te6edf3similarityPctTb4b4b4: Te6edf3compositeTb4b4b4,
Te6edf3lineJaccardPctTb4b4b4: Te6edf3lineJTb4b4b4,
Te6edf3bigramDicePctTb4b4b4: Te6edf3biDTb4b4b4,
Te6edf3shingle5PctTb4b4b4: Te6edf3sh5Tb4b4b4,
Te6edf3shingle7PctTb4b4b4: Te6edf3sh7Tb4b4b4,
Te6edf3lineCommonTb4b4b4: Te6edf3lineCommonTb4b4b4,
Te6edf3lineUnionTb4b4b4: Te6edf3lineUnionTb4b4b4,
Te6edf3bigramCommonTb4b4b4: Te6edf3biCommonTb4b4b4,
Te6edf3bigramTotalTb4b4b4: Te6edf3biTotalTb4b4b4,
Te6edf3shingle5CommonTb4b4b4: Te6edf3sh5CommonTb4b4b4,
Te6edf3shingle5UnionTb4b4b4: Te6edf3sh5UnionTb4b4b4,
Te6edf3shingle7CommonTb4b4b4: Te6edf3sh7CommonTb4b4b4,
Te6edf3shingle7UnionTb4b4b4: Te6edf3sh7UnionTb4b4b4,
Tb4b4b4}
Tb4b4b4}
T8b949e// classify maps a similarity result to an SPDX expression. The pure-0BSD
T8b949e// branch requires both --allow-pure-0bsd and --pure-0bsd-confirm-no-derivation
T8b949e// because textual similarity alone cannot prove non-derivation; renamed or
T8b949e// heavily refactored forks of upstream files retain MIT obligations.
Tff7b72func Te6edf3classifyTb4b4b4(Te6edf3match Te6edf3matchResultTb4b4b4, Te6edf3cfg Te6edf3configTb4b4b4) Tb4b4b4(Tffa657stringTb4b4b4, Tffa657stringTb4b4b4) Tb4b4b4{
Te6edf3sim Tff7b72:= Te6edf3matchTb4b4b4.Te6edf3similarityPct Tff7b72/ T79c0ff100.0
Tff7b72if Te6edf3sim Tff7b72>= Te6edf3cfgTb4b4b4.Te6edf3mitThreshold Tb4b4b4{
Tff7b72return Ta5d6ff"MIT"Tb4b4b4, Te6edf3fmtTb4b4b4.Te6edf3SprintfTb4b4b4(Ta5d6ff"composite similarity %.2f%% >= MIT threshold %.2f%%"Tb4b4b4, Te6edf3matchTb4b4b4.Te6edf3similarityPctTb4b4b4, Te6edf3cfgTb4b4b4.Te6edf3mitThresholdTff7b72*T79c0ff100.0Tb4b4b4)
Tb4b4b4}
Tff7b72if Te6edf3cfgTb4b4b4.Te6edf3allowPure0BSD Tff7b72&& Te6edf3cfgTb4b4b4.Te6edf3pure0BSDConfirmNoDerivation Tff7b72&& Tb4b4b4!Te6edf3matchTb4b4b4.Te6edf3directPathMatch Tff7b72&& Te6edf3matchTb4b4b4.Te6edf3similarityPct Tff7b72<= Te6edf3cfgTb4b4b4.Te6edf3pure0BSDThreshold Tb4b4b4{
Tff7b72return Ta5d6ff"0BSD"Tb4b4b4, Te6edf3fmtTb4b4b4.Te6edf3SprintfTb4b4b4(Ta5d6ff"low similarity %.2f%% <= pure-0bsd threshold %.2f%% and no direct path match (operator confirmed non-derivation)"Tb4b4b4, Te6edf3matchTb4b4b4.Te6edf3similarityPctTb4b4b4, Te6edf3cfgTb4b4b4.Te6edf3pure0BSDThresholdTb4b4b4)
Tb4b4b4}
Tff7b72if Te6edf3sim Tff7b72>= Te6edf3cfgTb4b4b4.Te6edf3mixedThreshold Tb4b4b4{
Tff7b72return Ta5d6ff"0BSD AND MIT"Tb4b4b4, Te6edf3fmtTb4b4b4.Te6edf3SprintfTb4b4b4(Ta5d6ff"composite similarity %.2f%% >= mixed threshold %.2f%%"Tb4b4b4, Te6edf3matchTb4b4b4.Te6edf3similarityPctTb4b4b4, Te6edf3cfgTb4b4b4.Te6edf3mixedThresholdTff7b72*T79c0ff100.0Tb4b4b4)
Tb4b4b4}
Tff7b72return Te6edf3cfgTb4b4b4.Te6edf3baseLicenseTb4b4b4, Te6edf3fmtTb4b4b4.Te6edf3SprintfTb4b4b4(Ta5d6ff"below mixed threshold; fallback to base license %s"Tb4b4b4, Te6edf3cfgTb4b4b4.Te6edf3baseLicenseTb4b4b4)
Tb4b4b4}
Tff7b72func Te6edf3makeNGramSetTb4b4b4(Te6edf3lines Tb4b4b4[Tb4b4b4]Tffa657stringTb4b4b4, Te6edf3n Tffa657intTb4b4b4) Tff7b72mapTb4b4b4[Tffa657uint64Tb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4} Tb4b4b4{
Te6edf3out Tff7b72:= Tff7b72mapTb4b4b4[Tffa657uint64Tb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4{Tb4b4b4}
Tff7b72if Te6edf3n Tff7b72<= T79c0ff0 Tff7b72|| Tffa657lenTb4b4b4(Te6edf3linesTb4b4b4) Tb4b4b4< Te6edf3n Tb4b4b4{
Tff7b72return Te6edf3out
Tb4b4b4}
Tff7b72for Te6edf3i Tff7b72:= T79c0ff0Tb4b4b4; Te6edf3i Tff7b72<= Tffa657lenTb4b4b4(Te6edf3linesTb4b4b4)Tff7b72-Te6edf3nTb4b4b4; Te6edf3iTff7b72++ Tb4b4b4{
Te6edf3outTb4b4b4[Te6edf3hashNGramTb4b4b4(Te6edf3linesTb4b4b4[Te6edf3iTb4b4b4:Te6edf3iTff7b72+Te6edf3nTb4b4b4]Tb4b4b4)Tb4b4b4] Tb4b4b4= Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4{Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3out
Tb4b4b4}
Tff7b72func Te6edf3hashNGramTb4b4b4(Te6edf3parts Tb4b4b4[Tb4b4b4]Tffa657stringTb4b4b4) Tffa657uint64 Tb4b4b4{
Te6edf3h Tff7b72:= Te6edf3fnvTb4b4b4.Te6edf3New64aTb4b4b4(Tb4b4b4)
Tff7b72for Te6edf3iTb4b4b4, Te6edf3p Tff7b72:= Tff7b72range Te6edf3parts Tb4b4b4{
Te6edf3_Tb4b4b4, Te6edf3_ Tb4b4b4= Te6edf3hTb4b4b4.Te6edf3WriteTb4b4b4(Tb4b4b4[Tb4b4b4]Tffa657byteTb4b4b4(Te6edf3pTb4b4b4)Tb4b4b4)
Tff7b72if Te6edf3iTff7b72+T79c0ff1 Tb4b4b4< Tffa657lenTb4b4b4(Te6edf3partsTb4b4b4) Tb4b4b4{
Te6edf3_Tb4b4b4, Te6edf3_ Tb4b4b4= Te6edf3hTb4b4b4.Te6edf3WriteTb4b4b4(Tb4b4b4[Tb4b4b4]Tffa657byteTb4b4b4{T79c0ff0Tb4b4b4}Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3hTb4b4b4.Te6edf3Sum64Tb4b4b4(Tb4b4b4)
Tb4b4b4}
Tff7b72func Te6edf3combineCompositeTb4b4b4(Te6edf3lineJTb4b4b4, Te6edf3biDTb4b4b4, Te6edf3sh5Tb4b4b4, Te6edf3sh7 Tffa657float64Tb4b4b4, Te6edf3hasBiTb4b4b4, Te6edf3hasS5Tb4b4b4, Te6edf3hasS7 Tffa657boolTb4b4b4) Tffa657float64 Tb4b4b4{
Tff7b72type Te6edf3part Tff7b72struct Tb4b4b4{
Te6edf3score Tffa657float64
Te6edf3weight Tffa657float64
Te6edf3ok Tffa657bool
Tb4b4b4}
Te6edf3parts Tff7b72:= Tb4b4b4[Tb4b4b4]Te6edf3partTb4b4b4{
Tb4b4b4{Te6edf3lineJTb4b4b4, T79c0ff0.20Tb4b4b4, Tff7b72trueTb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3biDTb4b4b4, T79c0ff0.30Tb4b4b4, Te6edf3hasBiTb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3sh5Tb4b4b4, T79c0ff0.30Tb4b4b4, Te6edf3hasS5Tb4b4b4}Tb4b4b4,
Tb4b4b4{Te6edf3sh7Tb4b4b4, T79c0ff0.20Tb4b4b4, Te6edf3hasS7Tb4b4b4}Tb4b4b4,
Tb4b4b4}
Te6edf3weighted Tff7b72:= T79c0ff0.0
Te6edf3total Tff7b72:= T79c0ff0.0
Tff7b72for Te6edf3_Tb4b4b4, Te6edf3p Tff7b72:= Tff7b72range Te6edf3parts Tb4b4b4{
Tff7b72if Tb4b4b4!Te6edf3pTb4b4b4.Te6edf3ok Tb4b4b4{
Tff7b72continue
Tb4b4b4}
Te6edf3weighted Tff7b72+= Te6edf3pTb4b4b4.Te6edf3score Tff7b72* Te6edf3pTb4b4b4.Te6edf3weight
Te6edf3total Tff7b72+= Te6edf3pTb4b4b4.Te6edf3weight
Tb4b4b4}
Tff7b72if Te6edf3total Tff7b72<= T79c0ff0 Tb4b4b4{
Tff7b72return T79c0ff0
Tb4b4b4}
Tff7b72return Te6edf3weighted Tff7b72/ Te6edf3total
Tb4b4b4}
Tff7b72func Te6edf3setJaccardPctWithCountsTb4b4b4[Te6edf3T Tffa657comparableTb4b4b4]Tb4b4b4(Te6edf3aTb4b4b4, Te6edf3b Tff7b72mapTb4b4b4[Te6edf3TTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4(Tffa657float64Tb4b4b4, Tffa657intTb4b4b4, Tffa657intTb4b4b4) Tb4b4b4{
Tff7b72if Tffa657lenTb4b4b4(Te6edf3aTb4b4b4) Tff7b72== T79c0ff0 Tff7b72|| Tffa657lenTb4b4b4(Te6edf3bTb4b4b4) Tff7b72== T79c0ff0 Tb4b4b4{
Tff7b72return T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3aTb4b4b4) Tff7b72+ Tffa657lenTb4b4b4(Te6edf3bTb4b4b4)
Tb4b4b4}
Te6edf3inter Tff7b72:= T79c0ff0
Tff7b72for Te6edf3k Tff7b72:= Tff7b72range Te6edf3a Tb4b4b4{
Tff7b72if Te6edf3_Tb4b4b4, Te6edf3ok Tff7b72:= Te6edf3bTb4b4b4[Te6edf3kTb4b4b4]Tb4b4b4; Te6edf3ok Tb4b4b4{
Te6edf3interTff7b72++
Tb4b4b4}
Tb4b4b4}
Te6edf3union Tff7b72:= Tffa657lenTb4b4b4(Te6edf3aTb4b4b4) Tff7b72+ Tffa657lenTb4b4b4(Te6edf3bTb4b4b4) Tff7b72- Te6edf3inter
Tff7b72if Te6edf3union Tff7b72<= T79c0ff0 Tb4b4b4{
Tff7b72return T79c0ff0Tb4b4b4, Te6edf3interTb4b4b4, Te6edf3union
Tb4b4b4}
Tff7b72return Tffa657float64Tb4b4b4(Te6edf3interTb4b4b4) Tff7b72/ Tffa657float64Tb4b4b4(Te6edf3unionTb4b4b4) Tff7b72* T79c0ff100.0Tb4b4b4, Te6edf3interTb4b4b4, Te6edf3union
Tb4b4b4}
Tff7b72func Te6edf3setDicePctWithCountsTb4b4b4[Te6edf3T Tffa657comparableTb4b4b4]Tb4b4b4(Te6edf3aTb4b4b4, Te6edf3b Tff7b72mapTb4b4b4[Te6edf3TTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4) Tb4b4b4(Tffa657float64Tb4b4b4, Tffa657intTb4b4b4, Tffa657intTb4b4b4) Tb4b4b4{
Tff7b72if Tffa657lenTb4b4b4(Te6edf3aTb4b4b4) Tff7b72== T79c0ff0 Tff7b72|| Tffa657lenTb4b4b4(Te6edf3bTb4b4b4) Tff7b72== T79c0ff0 Tb4b4b4{
Tff7b72return T79c0ff0Tb4b4b4, T79c0ff0Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3aTb4b4b4) Tff7b72+ Tffa657lenTb4b4b4(Te6edf3bTb4b4b4)
Tb4b4b4}
Te6edf3inter Tff7b72:= T79c0ff0
Tff7b72for Te6edf3k Tff7b72:= Tff7b72range Te6edf3a Tb4b4b4{
Tff7b72if Te6edf3_Tb4b4b4, Te6edf3ok Tff7b72:= Te6edf3bTb4b4b4[Te6edf3kTb4b4b4]Tb4b4b4; Te6edf3ok Tb4b4b4{
Te6edf3interTff7b72++
Tb4b4b4}
Tb4b4b4}
Te6edf3den Tff7b72:= Tffa657lenTb4b4b4(Te6edf3aTb4b4b4) Tff7b72+ Tffa657lenTb4b4b4(Te6edf3bTb4b4b4)
Tff7b72if Te6edf3den Tff7b72<= T79c0ff0 Tb4b4b4{
Tff7b72return T79c0ff0Tb4b4b4, Te6edf3interTb4b4b4, Te6edf3den
Tb4b4b4}
Tff7b72return T79c0ff2.0 Tff7b72* Tffa657float64Tb4b4b4(Te6edf3interTb4b4b4) Tff7b72/ Tffa657float64Tb4b4b4(Te6edf3denTb4b4b4) Tff7b72* T79c0ff100.0Tb4b4b4, Te6edf3interTb4b4b4, Te6edf3den
Tb4b4b4}
Tff7b72func Te6edf3loadOverridesTb4b4b4(Te6edf3path Tffa657stringTb4b4b4) Tb4b4b4(Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657stringTb4b4b4, Tffa657errorTb4b4b4) Tb4b4b4{
Tff7b72if Te6edf3stringsTb4b4b4.Te6edf3TrimSpaceTb4b4b4(Te6edf3pathTb4b4b4) Tff7b72== Ta5d6ff"" Tb4b4b4{
Tff7b72return Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657stringTb4b4b4{Tb4b4b4}Tb4b4b4, Tff7b72nil
Tb4b4b4}
Te6edf3rawTb4b4b4, Te6edf3err Tff7b72:= Te6edf3osTb4b4b4.Te6edf3ReadFileTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Tff7b72nilTb4b4b4, Te6edf3err
Tb4b4b4}
Te6edf3loaded Tff7b72:= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657stringTb4b4b4{Tb4b4b4}
Tff7b72if Te6edf3err Tff7b72:= Te6edf3jsonTb4b4b4.Te6edf3UnmarshalTb4b4b4(Te6edf3rawTb4b4b4, Tff7b72&Te6edf3loadedTb4b4b4)Tb4b4b4; Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Tff7b72nilTb4b4b4, Te6edf3err
Tb4b4b4}
Te6edf3out Tff7b72:= Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657stringTb4b4b4{Tb4b4b4}
Tff7b72for Te6edf3kTb4b4b4, Te6edf3v Tff7b72:= Tff7b72range Te6edf3loaded Tb4b4b4{
Te6edf3rel Tff7b72:= Te6edf3filepathTb4b4b4.Te6edf3ToSlashTb4b4b4(Te6edf3stringsTb4b4b4.Te6edf3TrimSpaceTb4b4b4(Te6edf3kTb4b4b4)Tb4b4b4)
Te6edf3lic Tff7b72:= Te6edf3stringsTb4b4b4.Te6edf3TrimSpaceTb4b4b4(Te6edf3vTb4b4b4)
Tff7b72if Te6edf3rel Tff7b72!= Ta5d6ff"" Tff7b72&& Te6edf3lic Tff7b72!= Ta5d6ff"" Tb4b4b4{
Te6edf3outTb4b4b4[Te6edf3relTb4b4b4] Tb4b4b4= Te6edf3lic
Tb4b4b4}
Tb4b4b4}
Tff7b72return Te6edf3outTb4b4b4, Tff7b72nil
Tb4b4b4}
Tff7b72func Te6edf3isHeaderExtTb4b4b4(Te6edf3path Tffa657stringTb4b4b4, Te6edf3exts Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4) Tffa657bool Tb4b4b4{
Te6edf3ext Tff7b72:= Te6edf3stringsTb4b4b4.Te6edf3ToLowerTb4b4b4(Te6edf3filepathTb4b4b4.Te6edf3ExtTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4)
Te6edf3_Tb4b4b4, Te6edf3ok Tff7b72:= Te6edf3extsTb4b4b4[Te6edf3extTb4b4b4]
Tff7b72return Te6edf3ok
Tb4b4b4}
Tff7b72func Te6edf3removeSPDXFromNonTargetFilesTb4b4b4(Te6edf3cfg Te6edf3configTb4b4b4) Tb4b4b4(Tffa657intTb4b4b4, Tffa657errorTb4b4b4) Tb4b4b4{
Te6edf3rootAbsTb4b4b4, Te6edf3_ Tff7b72:= Te6edf3filepathTb4b4b4.Te6edf3AbsTb4b4b4(Te6edf3cfgTb4b4b4.Te6edf3repoRootTb4b4b4)
Te6edf3removed Tff7b72:= T79c0ff0
Te6edf3err Tff7b72:= Te6edf3filepathTb4b4b4.Te6edf3WalkDirTb4b4b4(Te6edf3rootAbsTb4b4b4, Tff7b72funcTb4b4b4(Te6edf3path Tffa657stringTb4b4b4, Te6edf3d Te6edf3fsTb4b4b4.Te6edf3DirEntryTb4b4b4, Te6edf3walkErr Tffa657errorTb4b4b4) Tffa657error Tb4b4b4{
Tff7b72if Te6edf3walkErr Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Te6edf3walkErr
Tb4b4b4}
Tff7b72if Te6edf3dTb4b4b4.Te6edf3IsDirTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72if Te6edf3_Tb4b4b4, Te6edf3skip Tff7b72:= Te6edf3cfgTb4b4b4.Te6edf3excludedDirsTb4b4b4[Te6edf3dTb4b4b4.Te6edf3NameTb4b4b4(Tb4b4b4)Tb4b4b4]Tb4b4b4; Te6edf3skip Tb4b4b4{
Tff7b72return Te6edf3filepathTb4b4b4.Te6edf3SkipDir
Tb4b4b4}
Tff7b72return Tff7b72nil
Tb4b4b4}
Te6edf3relTb4b4b4, Te6edf3err Tff7b72:= Te6edf3filepathTb4b4b4.Te6edf3RelTb4b4b4(Te6edf3rootAbsTb4b4b4, Te6edf3pathTb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Te6edf3err
Tb4b4b4}
Te6edf3rel Tb4b4b4= Te6edf3filepathTb4b4b4.Te6edf3ToSlashTb4b4b4(Te6edf3relTb4b4b4)
Tff7b72if Te6edf3shouldSkipFileTb4b4b4(Te6edf3cfgTb4b4b4, Te6edf3relTb4b4b4, Te6edf3pathTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nil
Tb4b4b4}
Tff7b72if Te6edf3isHeaderExtTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3cfgTb4b4b4.Te6edf3headerExtsTb4b4b4) Tb4b4b4{
Tff7b72return Tff7b72nil
Tb4b4b4}
Te6edf3changedTb4b4b4, Te6edf3err Tff7b72:= Te6edf3removeSPDXLineTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Te6edf3err
Tb4b4b4}
Tff7b72if Te6edf3changed Tb4b4b4{
Te6edf3removedTff7b72++
Tb4b4b4}
Tff7b72return Tff7b72nil
Tb4b4b4}Tb4b4b4)
Tff7b72return Te6edf3removedTb4b4b4, Te6edf3err
Tb4b4b4}
Tff7b72func Te6edf3removeSPDXLineTb4b4b4(Te6edf3path Tffa657stringTb4b4b4) Tb4b4b4(Tffa657boolTb4b4b4, Tffa657errorTb4b4b4) Tb4b4b4{
Te6edf3rawTb4b4b4, Te6edf3err Tff7b72:= Te6edf3osTb4b4b4.Te6edf3ReadFileTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4, Te6edf3err
Tb4b4b4}
Te6edf3text Tff7b72:= Tffa657stringTb4b4b4(Te6edf3rawTb4b4b4)
Te6edf3lines Tff7b72:= Te6edf3stringsTb4b4b4.Te6edf3SplitTb4b4b4(Te6edf3textTb4b4b4, Ta5d6ff"\n"Tb4b4b4)
Te6edf3maxScan Tff7b72:= T79c0ff25
Tff7b72if Tffa657lenTb4b4b4(Te6edf3linesTb4b4b4) Tb4b4b4< Te6edf3maxScan Tb4b4b4{
Te6edf3maxScan Tb4b4b4= Tffa657lenTb4b4b4(Te6edf3linesTb4b4b4)
Tb4b4b4}
Te6edf3idx Tff7b72:= Tff7b72-T79c0ff1
Tff7b72for Te6edf3i Tff7b72:= T79c0ff0Tb4b4b4; Te6edf3i Tb4b4b4< Te6edf3maxScanTb4b4b4; Te6edf3iTff7b72++ Tb4b4b4{
Tff7b72if Te6edf3stringsTb4b4b4.Te6edf3ContainsTb4b4b4(Te6edf3linesTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, Ta5d6ff"SPDX-License-Identifier:"Tb4b4b4) Tb4b4b4{
Te6edf3idx Tb4b4b4= Te6edf3i
Tff7b72break
Tb4b4b4}
Tb4b4b4}
Tff7b72if Te6edf3idx Tb4b4b4< T79c0ff0 Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4, Tff7b72nil
Tb4b4b4}
Te6edf3out Tff7b72:= Tffa657appendTb4b4b4(Tb4b4b4[Tb4b4b4]Tffa657stringTb4b4b4{Tb4b4b4}Tb4b4b4, Te6edf3linesTb4b4b4[Tb4b4b4:Te6edf3idxTb4b4b4]Tff7b72...Tb4b4b4)
Tff7b72if Te6edf3idxTff7b72+T79c0ff1 Tb4b4b4< Tffa657lenTb4b4b4(Te6edf3linesTb4b4b4) Tff7b72&& Te6edf3stringsTb4b4b4.Te6edf3TrimSpaceTb4b4b4(Te6edf3linesTb4b4b4[Te6edf3idxTff7b72+T79c0ff1Tb4b4b4]Tb4b4b4) Tff7b72== Ta5d6ff"" Tb4b4b4{
Te6edf3out Tb4b4b4= Tffa657appendTb4b4b4(Te6edf3outTb4b4b4, Te6edf3linesTb4b4b4[Te6edf3idxTff7b72+T79c0ff2Tb4b4b4:Tb4b4b4]Tff7b72...Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3out Tb4b4b4= Tffa657appendTb4b4b4(Te6edf3outTb4b4b4, Te6edf3linesTb4b4b4[Te6edf3idxTff7b72+T79c0ff1Tb4b4b4:Tb4b4b4]Tff7b72...Tb4b4b4)
Tb4b4b4}
Te6edf3newText Tff7b72:= Te6edf3stringsTb4b4b4.Te6edf3JoinTb4b4b4(Te6edf3outTb4b4b4, Ta5d6ff"\n"Tb4b4b4)
Tff7b72if Te6edf3newText Tff7b72== Te6edf3text Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4, Tff7b72nil
Tb4b4b4}
Tff7b72return Tff7b72trueTb4b4b4, Te6edf3osTb4b4b4.Te6edf3WriteFileTb4b4b4(Te6edf3pathTb4b4b4, Tb4b4b4[Tb4b4b4]Tffa657byteTb4b4b4(Te6edf3newTextTb4b4b4)Tb4b4b4, T79c0ff0Te6edf3o644Tb4b4b4)
Tb4b4b4}
Tff7b72func Te6edf3upsertSPDXTb4b4b4(Te6edf3pathTb4b4b4, Te6edf3spdx Tffa657stringTb4b4b4, Te6edf3replaceExisting Tffa657boolTb4b4b4) Tb4b4b4(Tffa657boolTb4b4b4, Tffa657stringTb4b4b4, Tffa657errorTb4b4b4) Tb4b4b4{
Te6edf3ext Tff7b72:= Te6edf3stringsTb4b4b4.Te6edf3ToLowerTb4b4b4(Te6edf3filepathTb4b4b4.Te6edf3ExtTb4b4b4(Te6edf3pathTb4b4b4)Tb4b4b4)
Te6edf3styleTb4b4b4, Te6edf3ok Tff7b72:= Te6edf3commentStyleByExtTb4b4b4[Te6edf3extTb4b4b4]
Tff7b72if Tb4b4b4!Te6edf3ok Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4, Ta5d6ff""Tb4b4b4, Tff7b72nil
Tb4b4b4}
Te6edf3rawTb4b4b4, Te6edf3err Tff7b72:= Te6edf3osTb4b4b4.Te6edf3ReadFileTb4b4b4(Te6edf3pathTb4b4b4)
Tff7b72if Te6edf3err Tff7b72!= Tff7b72nil Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4, Ta5d6ff""Tb4b4b4, Te6edf3err
Tb4b4b4}
Te6edf3text Tff7b72:= Tffa657stringTb4b4b4(Te6edf3rawTb4b4b4)
Te6edf3lines Tff7b72:= Te6edf3stringsTb4b4b4.Te6edf3SplitTb4b4b4(Te6edf3textTb4b4b4, Ta5d6ff"\n"Tb4b4b4)
Te6edf3existingIdx Tff7b72:= Tff7b72-T79c0ff1
Te6edf3existingValue Tff7b72:= Ta5d6ff""
Te6edf3maxScan Tff7b72:= T79c0ff25
Tff7b72if Tffa657lenTb4b4b4(Te6edf3linesTb4b4b4) Tb4b4b4< Te6edf3maxScan Tb4b4b4{
Te6edf3maxScan Tb4b4b4= Tffa657lenTb4b4b4(Te6edf3linesTb4b4b4)
Tb4b4b4}
Tff7b72for Te6edf3i Tff7b72:= T79c0ff0Tb4b4b4; Te6edf3i Tb4b4b4< Te6edf3maxScanTb4b4b4; Te6edf3iTff7b72++ Tb4b4b4{
Tff7b72if Te6edf3stringsTb4b4b4.Te6edf3ContainsTb4b4b4(Te6edf3linesTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4, Ta5d6ff"SPDX-License-Identifier:"Tb4b4b4) Tb4b4b4{
Te6edf3existingIdx Tb4b4b4= Te6edf3i
Te6edf3m Tff7b72:= Te6edf3spdxPatternTb4b4b4.Te6edf3FindStringSubmatchTb4b4b4(Te6edf3linesTb4b4b4[Te6edf3iTb4b4b4]Tb4b4b4)
Tff7b72if Tffa657lenTb4b4b4(Te6edf3mTb4b4b4) Tb4b4b4> T79c0ff1 Tb4b4b4{
Te6edf3existingValue Tb4b4b4= Te6edf3stringsTb4b4b4.Te6edf3TrimSpaceTb4b4b4(Te6edf3mTb4b4b4[T79c0ff1Tb4b4b4]Tb4b4b4)
Tb4b4b4}
Tff7b72break
Tb4b4b4}
Tb4b4b4}
Te6edf3spdxLine Tff7b72:= Te6edf3formatSPDXTb4b4b4(Te6edf3styleTb4b4b4, Te6edf3spdxTb4b4b4)
Tff7b72if Te6edf3existingIdx Tff7b72>= T79c0ff0 Tb4b4b4{
Tff7b72if Tb4b4b4!Te6edf3replaceExisting Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4, Te6edf3existingValueTb4b4b4, Tff7b72nil
Tb4b4b4}
Te6edf3linesTb4b4b4[Te6edf3existingIdxTb4b4b4] Tb4b4b4= Te6edf3spdxLine
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3insertAt Tff7b72:= T79c0ff0
Tff7b72if Tffa657lenTb4b4b4(Te6edf3linesTb4b4b4) Tb4b4b4> T79c0ff0 Tff7b72&& Te6edf3stringsTb4b4b4.Te6edf3HasPrefixTb4b4b4(Te6edf3linesTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4, Ta5d6ff"#!"Tb4b4b4) Tb4b4b4{
Te6edf3insertAt Tb4b4b4= T79c0ff1
Tb4b4b4}
Tff7b72if Te6edf3ext Tff7b72== Ta5d6ff".py" Tff7b72&& Tffa657lenTb4b4b4(Te6edf3linesTb4b4b4) Tb4b4b4> Te6edf3insertAt Tff7b72&& Te6edf3stringsTb4b4b4.Te6edf3HasPrefixTb4b4b4(Te6edf3linesTb4b4b4[Te6edf3insertAtTb4b4b4]Tb4b4b4, Ta5d6ff"#"Tb4b4b4) Tff7b72&& Te6edf3stringsTb4b4b4.Te6edf3ContainsTb4b4b4(Te6edf3linesTb4b4b4[Te6edf3insertAtTb4b4b4]Tb4b4b4, Ta5d6ff"coding"Tb4b4b4) Tb4b4b4{
Te6edf3insertAtTff7b72++
Tb4b4b4}
Te6edf3prefix Tff7b72:= Tffa657appendTb4b4b4(Tb4b4b4[Tb4b4b4]Tffa657stringTb4b4b4{Tb4b4b4}Tb4b4b4, Te6edf3linesTb4b4b4[Tb4b4b4:Te6edf3insertAtTb4b4b4]Tff7b72...Tb4b4b4)
Te6edf3suffix Tff7b72:= Tffa657appendTb4b4b4(Tb4b4b4[Tb4b4b4]Tffa657stringTb4b4b4{Tb4b4b4}Tb4b4b4, Te6edf3linesTb4b4b4[Te6edf3insertAtTb4b4b4:Tb4b4b4]Tff7b72...Tb4b4b4)
Te6edf3lines Tb4b4b4= Tffa657appendTb4b4b4(Te6edf3prefixTb4b4b4, Te6edf3spdxLineTb4b4b4, Ta5d6ff""Tb4b4b4)
Te6edf3lines Tb4b4b4= Tffa657appendTb4b4b4(Te6edf3linesTb4b4b4, Te6edf3suffixTff7b72...Tb4b4b4)
Tb4b4b4}
Te6edf3newText Tff7b72:= Te6edf3stringsTb4b4b4.Te6edf3JoinTb4b4b4(Te6edf3linesTb4b4b4, Ta5d6ff"\n"Tb4b4b4)
Tff7b72if Te6edf3newText Tff7b72== Te6edf3text Tb4b4b4{
Tff7b72return Tff7b72falseTb4b4b4, Te6edf3existingValueTb4b4b4, Tff7b72nil
Tb4b4b4}
Tff7b72return Tff7b72trueTb4b4b4, Te6edf3existingValueTb4b4b4, Te6edf3osTb4b4b4.Te6edf3WriteFileTb4b4b4(Te6edf3pathTb4b4b4, Tb4b4b4[Tb4b4b4]Tffa657byteTb4b4b4(Te6edf3newTextTb4b4b4)Tb4b4b4, T79c0ff0Te6edf3o644Tb4b4b4)
Tb4b4b4}
Tff7b72func Te6edf3formatSPDXTb4b4b4(Te6edf3styleTb4b4b4, Te6edf3spdx Tffa657stringTb4b4b4) Tffa657string Tb4b4b4{
Tff7b72switch Te6edf3style Tb4b4b4{
Tff7b72case Ta5d6ff"hash"Tb4b4b4:
Tff7b72return Ta5d6ff"# SPDX-License-Identifier: " Tff7b72+ Te6edf3spdx
Tff7b72case Ta5d6ff"line"Tb4b4b4:
Tff7b72return Ta5d6ff"// SPDX-License-Identifier: " Tff7b72+ Te6edf3spdx
Tff7b72case Ta5d6ff"block"Tb4b4b4:
Tff7b72return Ta5d6ff"/* SPDX-License-Identifier: " Tff7b72+ Te6edf3spdx Tff7b72+ Ta5d6ff" */"
Tff7b72case Ta5d6ff"html"Tb4b4b4:
Tff7b72return Ta5d6ff"<!-- SPDX-License-Identifier: " Tff7b72+ Te6edf3spdx Tff7b72+ Ta5d6ff" -->"
Tff7b72defaultTb4b4b4:
Tff7b72return Ta5d6ff"// SPDX-License-Identifier: " Tff7b72+ Te6edf3spdx
Tb4b4b4}
Tb4b4b4}
Tff7b72func Te6edf3formatCountSummaryTb4b4b4(Te6edf3counts Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tffa657intTb4b4b4, Te6edf3total Tffa657float64Tb4b4b4) Tffa657string Tb4b4b4{
Te6edf3keys Tff7b72:= Tffa657makeTb4b4b4(Tb4b4b4[Tb4b4b4]Tffa657stringTb4b4b4, T79c0ff0Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3countsTb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3k Tff7b72:= Tff7b72range Te6edf3counts Tb4b4b4{
Te6edf3keys Tb4b4b4= Tffa657appendTb4b4b4(Te6edf3keysTb4b4b4, Te6edf3kTb4b4b4)
Tb4b4b4}
Te6edf3sortTb4b4b4.Te6edf3StringsTb4b4b4(Te6edf3keysTb4b4b4)
Te6edf3parts Tff7b72:= Tffa657makeTb4b4b4(Tb4b4b4[Tb4b4b4]Tffa657stringTb4b4b4, T79c0ff0Tb4b4b4, Tffa657lenTb4b4b4(Te6edf3keysTb4b4b4)Tb4b4b4)
Tff7b72for Te6edf3_Tb4b4b4, Te6edf3k Tff7b72:= Tff7b72range Te6edf3keys Tb4b4b4{
Te6edf3parts Tb4b4b4= Tffa657appendTb4b4b4(Te6edf3partsTb4b4b4, Te6edf3fmtTb4b4b4.Te6edf3SprintfTb4b4b4(Ta5d6ff"%s: %d (%.2f%%)"Tb4b4b4, Te6edf3kTb4b4b4, Te6edf3countsTb4b4b4[Te6edf3kTb4b4b4]Tb4b4b4, Te6edf3pctTb4b4b4(Te6edf3countsTb4b4b4[Te6edf3kTb4b4b4]Tb4b4b4, Te6edf3totalTb4b4b4)Tb4b4b4)Tb4b4b4)
Tb4b4b4}
Tff7b72return Te6edf3stringsTb4b4b4.Te6edf3JoinTb4b4b4(Te6edf3partsTb4b4b4, Ta5d6ff", "Tb4b4b4)
Tb4b4b4}
Tff7b72func Te6edf3shouldExplainPathTb4b4b4(Te6edf3relPath Tffa657stringTb4b4b4, Te6edf3explainAll Tffa657boolTb4b4b4, Te6edf3explainPaths Tff7b72mapTb4b4b4[Tffa657stringTb4b4b4]Tff7b72structTb4b4b4{Tb4b4b4}Tb4b4b4) Tffa657bool Tb4b4b4{
Tff7b72if Te6edf3explainAll Tb4b4b4{
Tff7b72return Tff7b72true
Tb4b4b4}
Te6edf3_Tb4b4b4, Te6edf3ok Tff7b72:= Te6edf3explainPathsTb4b4b4[Te6edf3filepathTb4b4b4.Te6edf3ToSlashTb4b4b4(Te6edf3relPathTb4b4b4)Tb4b4b4]
Tff7b72return Te6edf3ok
Tb4b4b4}
Tff7b72func Te6edf3printExplanationTb4b4b4(Te6edf3relPath Tffa657stringTb4b4b4, Te6edf3match Te6edf3matchResultTb4b4b4, Te6edf3licenseTb4b4b4, Te6edf3decisionReason Tffa657stringTb4b4b4, Te6edf3cfg Te6edf3configTb4b4b4) Tb4b4b4{
Te6edf3fmtTb4b4b4.Te6edf3PrintfTb4b4b4(Ta5d6ff"\n--- score explanation: %s ---\n"Tb4b4b4, Te6edf3relPathTb4b4b4)
Tff7b72if Te6edf3matchTb4b4b4.Te6edf3upstreamRelPath Tff7b72== Ta5d6ff"" Tb4b4b4{
Te6edf3fmtTb4b4b4.Te6edf3PrintfTb4b4b4(Ta5d6ff"upstream match: <none>\n"Tb4b4b4)
Tb4b4b4} Tff7b72else Tb4b4b4{
Te6edf3fmtTb4b4b4.Te6edf3PrintfTb4b4b4(Ta5d6ff"upstream match: %s\n"Tb4b4b4, Te6edf3matchTb4b4b4.Te6edf3upstreamRelPathTb4b4b4)
Tb4b4b4}
Te6edf3fmtTb4b4b4.Te6edf3PrintfTb4b4b4(Ta5d6ff"direct path match: %v\n"Tb4b4b4, Te6edf3matchTb4b4b4.Te6edf3directPathMatchTb4b4b4)
Te6edf3fmtTb4b4b4.Te6edf3PrintfTb4b4b4(Ta5d6ff"composite similarity: %.2f%%\n"Tb4b4b4, Te6edf3matchTb4b4b4.Te6edf3similarityPctTb4b4b4)
Te6edf3fmtTb4b4b4.Te6edf3PrintfTb4b4b4(Ta5d6ff"line_jaccard: %.2f%% (%d common / %d union)\n"Tb4b4b4, Te6edf3matchTb4b4b4.Te6edf3lineJaccardPctTb4b4b4, Te6edf3matchTb4b4b4.Te6edf3lineCommonTb4b4b4, Te6edf3matchTb4b4b4.Te6edf3lineUnionTb4b4b4)
Te6edf3fmtTb4b4b4.Te6edf3PrintfTb4b4b4(Ta5d6ff"bigram_dice: %.2f%% (%d common / %d total)\n"Tb4b4b4, Te6edf3matchTb4b4b4.Te6edf3bigramDicePctTb4b4b4, Te6edf3matchTb4b4b4.Te6edf3bigramCommonTb4b4b4, Te6edf3matchTb4b4b4.Te6edf3bigramTotalTb4b4b4)
Te6edf3fmtTb4b4b4.Te6edf3PrintfTb4b4b4(Ta5d6ff"shingle5_jaccard: %.2f%% (%d common / %d union)\n"Tb4b4b4, Te6edf3matchTb4b4b4.Te6edf3shingle5PctTb4b4b4, Te6edf3matchTb4b4b4.Te6edf3shingle5CommonTb4b4b4, Te6edf3matchTb4b4b4.Te6edf3shingle5UnionTb4b4b4)
Te6edf3fmtTb4b4b4.Te6edf3PrintfTb4b4b4(Ta5d6ff"shingle7_jaccard: %.2f%% (%d common / %d union)\n"Tb4b4b4, Te6edf3matchTb4b4b4.Te6edf3shingle7PctTb4b4b4, Te6edf3matchTb4b4b4.Te6edf3shingle7CommonTb4b4b4, Te6edf3matchTb4b4b4.Te6edf3shingle7UnionTb4b4b4)
Te6edf3fmtTb4b4b4.Te6edf3PrintfTb4b4b4(
Ta5d6ff"thresholds: mit=%.2f%% mixed=%.2f%% pure_0bsd=%.2f%% allow_pure_0bsd=%v\n"Tb4b4b4,
Te6edf3cfgTb4b4b4.Te6edf3mitThresholdTff7b72*T79c0ff100.0Tb4b4b4,
Te6edf3cfgTb4b4b4.Te6edf3mixedThresholdTff7b72*T79c0ff100.0Tb4b4b4,
Te6edf3cfgTb4b4b4.Te6edf3pure0BSDThresholdTb4b4b4,
Te6edf3cfgTb4b4b4.Te6edf3allowPure0BSDTb4b4b4,
Tb4b4b4)
Te6edf3fmtTb4b4b4.Te6edf3PrintfTb4b4b4(Ta5d6ff"decision: %s (%s)\n"Tb4b4b4, Te6edf3licenseTb4b4b4, Te6edf3decisionReasonTb4b4b4)
Te6edf3fmtTb4b4b4.Te6edf3PrintfTb4b4b4(Ta5d6ff"--- end explanation ---\n"Tb4b4b4)
Tb4b4b4}
Tff7b72func Te6edf3round2Tb4b4b4(Te6edf3v Tffa657float64Tb4b4b4) Tffa657float64 Tb4b4b4{
Tff7b72return Tffa657float64Tb4b4b4(Tffa657intTb4b4b4(Te6edf3vTff7b72*T79c0ff100Tff7b72+T79c0ff0.5Tb4b4b4)Tb4b4b4) Tff7b72/ T79c0ff100
Tb4b4b4}
Tff7b72func Te6edf3pctTb4b4b4(Te6edf3count Tffa657intTb4b4b4, Te6edf3total Tffa657float64Tb4b4b4) Tffa657float64 Tb4b4b4{
Tff7b72if Te6edf3total Tff7b72<= T79c0ff0 Tb4b4b4{
Tff7b72return T79c0ff0
Tb4b4b4}
Tff7b72return Tffa657float64Tb4b4b4(Te6edf3countTb4b4b4) Tff7b72/ Te6edf3total Tff7b72* T79c0ff100.0
Tb4b4b4}
T8b949e// emitSafetyNotices prints stderr warnings for flag combinations that can
T8b949e// silently relicense or strip third-party license markers. The pure-0BSD
T8b949e// branch in classify also requires the explicit confirm flag, so this
T8b949e// function reminds the operator when --allow-pure-0bsd is set without it.
Tff7b72func Te6edf3emitSafetyNoticesTb4b4b4(Te6edf3cfg Te6edf3configTb4b4b4) Tb4b4b4{
Tff7b72if Te6edf3cfgTb4b4b4.Te6edf3allowPure0BSD Tff7b72&& Tb4b4b4!Te6edf3cfgTb4b4b4.Te6edf3pure0BSDConfirmNoDerivation Tb4b4b4{
Te6edf3fmtTb4b4b4.Te6edf3FprintlnTb4b4b4(Te6edf3osTb4b4b4.Te6edf3StderrTb4b4b4,
Ta5d6ff"warning: --allow-pure-0bsd is set but --pure-0bsd-confirm-no-derivation is not; "Tff7b72+
Ta5d6ff"pure 0BSD classification will not be applied. Textual similarity is not a legal "Tff7b72+
Ta5d6ff"test for derivative-work status."Tb4b4b4)
Tb4b4b4}
Tff7b72if Te6edf3cfgTb4b4b4.Te6edf3allowPure0BSD Tff7b72&& Te6edf3cfgTb4b4b4.Te6edf3pure0BSDConfirmNoDerivation Tb4b4b4{
Te6edf3fmtTb4b4b4.Te6edf3FprintlnTb4b4b4(Te6edf3osTb4b4b4.Te6edf3StderrTb4b4b4,
Ta5d6ff"warning: pure-0BSD classification is enabled. Files with low similarity and no "Tff7b72+
Ta5d6ff"direct path match will be labeled 0BSD. Confirm those files are not derivative "Tff7b72+
Ta5d6ff"works of upstream sources before publishing."Tb4b4b4)
Tb4b4b4}
Tff7b72if Te6edf3cfgTb4b4b4.Te6edf3cleanNonTarget Tb4b4b4{
Te6edf3fmtTb4b4b4.Te6edf3FprintlnTb4b4b4(Te6edf3osTb4b4b4.Te6edf3StderrTb4b4b4,
Ta5d6ff"warning: --clean-non-target-spdx is set; SPDX headers in files outside header-exts "Tff7b72+
Ta5d6ff"will be removed. Audit the diff before committing to avoid stripping third-party "Tff7b72+
Ta5d6ff"license markers in vendored or generated files."Tb4b4b4)
Tb4b4b4}
Tff7b72if Te6edf3cfgTb4b4b4.Te6edf3replaceExisting Tb4b4b4{
Te6edf3fmtTb4b4b4.Te6edf3FprintlnTb4b4b4(Te6edf3osTb4b4b4.Te6edf3StderrTb4b4b4,
Ta5d6ff"warning: --replace-existing is set; existing SPDX headers will be overwritten by "Tff7b72+
Ta5d6ff"the classifier output. Review the report-json before committing."Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tff7b72func Te6edf3exitErrTb4b4b4(Te6edf3err Tffa657errorTb4b4b4) Tb4b4b4{
Te6edf3_Tb4b4b4, Te6edf3_ Tb4b4b4= Te6edf3fmtTb4b4b4.Te6edf3FprintfTb4b4b4(Te6edf3osTb4b4b4.Te6edf3StderrTb4b4b4, Ta5d6ff"Error: %v\n"Tb4b4b4, Te6edf3errTb4b4b4)
Te6edf3osTb4b4b4.Te6edf3ExitTb4b4b4(T79c0ff1Tb4b4b4)
Tb4b4b4}
Tff7b72func Te6edf3initTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3_ Tb4b4b4= Te6edf3runtimeTb4b4b4.Te6edf3GOMAXPROCSTb4b4b4(Te6edf3runtimeTb4b4b4.Te6edf3NumCPUTb4b4b4(Tb4b4b4)Tb4b4b4)
Tb4b4b4}
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────